shiro cache ,数据库 实现
有没有减少数据库访问的方法,或者利用个中间件缓存是否可以操作,或着有什么更好的思路,麻烦告知一下
AtomicInteger retryCount = passwordRetryCache.get(username);
if (null == retryCount) {
// 获取用户失败次数 此处查询了数据库
int num = UserUtils.selectUserLoginNum(username);
//此处查询了数据库
Date lastLoginDate = UserUtils.getLastLoginDateByUserName(username);
if(null != lastLoginDate){
long l = (System.currentTimeMillis() - lastLoginDate.getTime()) / (60 * 1000);
//超时之后 60解锁
if(num >= 5){
if(l>=60){
UserUtils.updateFailNum("0", "0", username );
}
}
}
retryCount = new AtomicInteger(num);
passwordRetryCache.put(username, retryCount);
}
long lockTime = cacheManager.getCacheManager().getCache("passwordRetryCache").getCacheConfiguration().getTimeToLiveSeconds();
// passwordIsTrue 检验密码方法返回判断 stopNum 错误次数
if(passwordIsTrue){
if (retryCount.get() == stopNum) {
//throw new ExcessiveAttemptsException("msg: " + username + "登陆次数超过5次");
throw new LockedAccountException("账户被锁定,请于" + lockTime / 60 / 60 + "小时后重新登录");
}else if(retryCount.get() > stopNum){
throw new LockedAccountException("账户被锁定!");
}else{
passwordRetryCache.remove(username);
//成功清除缓存 操作数据库
UserUtils.updateFailNum("0","0",username);
}
}else{
retryCount.incrementAndGet();
//用来记录清除缓存后 如果有失败次数记录
UserUtils.updateFailNum(String.valueOf(retryCount.get()),"1",username);
if (retryCount.get() == stopNum) {
throw new LockedAccountException("账户被锁定,请于" + lockTime / 60 / 60 + "小时后重新登录");
}else if(retryCount.get() > stopNum){
throw new LockedAccountException("账户被锁定!");
}else{
throw new ExcessiveAttemptsException("密码错误, 请重试.尝试登陆第: " + retryCount.get() + "次,您还有"+(5 - retryCount.get())+"次机会");
}
}
可以用redis,记录失败次数什么的很方便,完全可以代替你的数据库操作,至于第二天清零,可以通过定时任务来处理
好的,我这就去 操作下
Redis 就可以了,设置过期时间