鱼C论坛

 找回密码
 立即注册
查看: 169|回复: 3

[已解决]想问下代码这样写有问题吗?

[复制链接]
发表于 2024-2-14 17:00:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原来是这样写的

        @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())){'

请问这样可以吗?
最佳答案
2024-2-14 17:00:59
您的修改是可行的,不会有语法错误,但是这样的代码逻辑可能会导致重复查询数据库,影响性能。

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-14 17:00:59 | 显示全部楼层    本楼为最佳答案   
您的修改是可行的,不会有语法错误,但是这样的代码逻辑可能会导致重复查询数据库,影响性能。

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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("密码错误");
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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`类型,如下所示:

  1. User loginUser = (User) userService.findByUserName(username);
复制代码


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

  1. Object result = userService.findByUserName(username);
  2. if (result instanceof User) {
  3.     User loginUser = (User) result;
  4.     // 其他逻辑...
  5. } else {
  6.     // 处理返回值类型不匹配的情况
  7. }
复制代码


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

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

  5. if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {
  6.     // 验证密码通过的逻辑
  7.     // ...
  8. } else {
  9.     return Result.error("密码错误");
  10. }
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 11:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表