mumei2018 发表于 2024-2-14 17:00:45

想问下代码这样写有问题吗?

原来是这样写的

        @PostMapping("/login")
        public Result login(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}")String password) {
               
                User loginUser = userService.findByUserName(username);
               
                if(userService.findByUserName(username) == null) {
                        return Result.error("用户不存在");
                }
               
                if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){
                        Map<String, Object> claims = new HashMap<>();
                        claims.put("id", loginUser.getId());
                        claims.put("username", loginUser.getUsername());
                        String token = JwtUtil.genToken(claims);
                       
                        return Result.success(token);

但是我想把‘User loginUser = userService.findByUserName(username);’这一段省掉

然后‘if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){’这一段改成'if(Md5Util.getMD5String(password).equals(userService.findByUserName(username).getPassword())){'

请问这样可以吗?

FishC 发表于 2024-2-14 17:00:59

您的修改是可行的,不会有语法错误,但是这样的代码逻辑可能会导致重复查询数据库,影响性能。

在原来的代码中,您先通过`userService.findByUserName(username)`方法查询到了一个`User`对象,并将其赋值给`loginUser`变量。然后在接下来的判断中,可以直接使用`loginUser`对象的属性进行比较操作。

而您的修改中,每次判断时都会重新执行`userService.findByUserName(username)`方法来获取`User`对象,这样就可能会导致多次查询数据库,增加了不必要的开销。

所以,建议您尽量保持原来的代码逻辑,先将查询结果保存在一个变量中,避免重复查询数据库。这样不仅可以提高性能,还能使代码更加清晰易懂。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

mumei2018 发表于 2024-2-14 17:11:05

FishC 发表于 2024-2-14 17:00
您的修改是可行的,不会有语法错误,但是这样的代码逻辑可能会导致重复查询数据库,影响性能。

在原来的 ...

请问这段代码有什么问题

        @PostMapping("/login")
        public Result login(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}")String password) {
               
                User loginUser = userService.findByUserName(username);   //在这个地方出现报错 Type mismatch: cannot convert from Object to User
               
                if(userService.findByUserName(username) == null) {
                        return Result.error("用户不存在");
                }
               
                if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){
                        Map<String, Object> claims = new HashMap<>();
                        claims.put("id", loginUser.getId());
                        claims.put("username", loginUser.getUsername());
                        String token = JwtUtil.genToken(claims);
                       
                        return Result.success(token);
                       
                }
               
                return Result.error("密码错误");

FishC 发表于 2024-2-14 17:11:25

mumei2018 发表于 2024-02-14 17:11
请问这段代码有什么问题

        @PostMapping("/login") ...

根据您提供的代码,报错信息显示在`loginUser`的赋值语句这行出现了类型不匹配错误,无法将`Object`类型转换为`User`类型。这种情况通常发生在`userService.findByUserName(username)`返回的类型与`User`不一致。

请检查`userService.findByUserName`方法的返回类型是否正确。如果返回的是一个`Object`类型而不是`User`类型,那么您需要将其强制转换为`User`类型,如下所示:

User loginUser = (User) userService.findByUserName(username);

然而,进行类型强制转换之前,请确保`userService.findByUserName`方法确实返回一个`User`对象,否则会抛出`ClassCastException`异常。在进行强制类型转换之前最好先检查返回值的类型,例如:

Object result = userService.findByUserName(username);
if (result instanceof User) {
    User loginUser = (User) result;
    // 其他逻辑...
} else {
    // 处理返回值类型不匹配的情况
}

另外,根据您的代码逻辑,如果用户名不存在,您直接返回了一个错误结果。但是,在密码验证部分,您没有处理用户名不存在的情况。建议您在密码验证之前先判断用户是否存在,如果不存在,可以直接返回错误结果。这样可以提高代码执行效率和安全性。

User loginUser = userService.findByUserName(username);
if (loginUser == null) {
    return Result.error("用户不存在");
}

if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {
    // 验证密码通过的逻辑
    // ...
} else {
    return Result.error("密码错误");
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 想问下代码这样写有问题吗?