网页多次调用同一方法查询,LambdaQueryWrapper持续追加判断条件,致使登录时只要有一次账密输入错误之后无法正常登录

文章讨论了在SpringMVC项目中,将LambdaQueryWrapper实例化在类级别而非方法级别导致的问题。当查询条件在类内创建并重复使用时,每次调用会添加新的条件,而不是重置,这可能导致登录失败,因为密码错误的条件会持续存在。解决办法是将Wrapper的实例化移动到具体的方法内部,确保每次请求都创建新的查询条件。
摘要由CSDN通过智能技术生成

先贴问题代码

@Controller
@RequestMapping("/Admin")
public class AdminController {
    @Autowired
    private AdminService adminService;
    ModelAndView modelAndView = new ModelAndView();
    LambdaQueryWrapper<Admin> lqw = new LambdaQueryWrapper<>();

    @RequestMapping("/loginUI")
    public String AdminLoginUI() {
        return "adminlogin";
    }

    @RequestMapping("/login")
    public ModelAndView AdminLogin(@Param("username") String username, @Param("password") String password) {
        lqw.eq(Admin::getUsername, username)
                .eq(Admin::getPassword, password)
                .select(Admin::getUsername, Admin::getPassword);
        if (Utils.isNotnull(adminService.getOne(lqw))) {
            modelAndView.setViewName("adminhome");
            modelAndView.addObject("adminInfo", adminService.list());
        } else {
            modelAndView.addObject("msg", "密码输入错误");
            modelAndView.setViewName("redirect:/Admin/loginUI");
        }
        return modelAndView;
    }
}

 以为Wrapper用法和ModelAndView一样,写在类里就ok的,实际并不是,这么写经过多次调用后, LambdaQueryWrapper后的条件会一直追加(虽然不会报错),SQL语句越来越长,只要有一次账密输入错误,之后的判断条件一直为false,导致无法登录,就像下面这样:

 

 username和password会一直追加,正确的写法应该将Wrapper写到方法内部,而不是类的内部,就像这样:

@Controller
@RequestMapping("/Admin")
public class AdminController {
    @Autowired
    private AdminService adminService;
    ModelAndView modelAndView = new ModelAndView();

    @RequestMapping("/loginUI")
    public String AdminLoginUI() {
        return "adminlogin";
    }

    @RequestMapping("/login")
    public ModelAndView AdminLogin(@Param("username") String username, @Param("password") String password) {
        LambdaQueryWrapper<Admin> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Admin::getUsername, username)
                .eq(Admin::getPassword, password)
                .select(Admin::getUsername, Admin::getPassword);
        if (Utils.isNotnull(adminService.getOne(lqw))) {
            modelAndView.setViewName("adminhome");
            modelAndView.addObject("adminInfo", adminService.list());
        } else {
            modelAndView.addObject("msg", "密码输入错误");
            modelAndView.setViewName("redirect:/Admin/loginUI");
        }
        return modelAndView;
    }
}

 

 这样就好啦,再试一遍

问题解决了,但是为什么会这样还是不明白,求大佬指点。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值