浏览代码

用户登录优化

zhijiezhao 2 年之前
父节点
当前提交
82ee50ae43

+ 1 - 4
src/main/java/com/caimei365/user/service/impl/BaseServiceImpl.java

@@ -401,10 +401,7 @@ public class BaseServiceImpl implements BaseService {
         String dbPassword = Md5Util.md5(passWord);
         baseMapper.updatePasswordByUserId(dbPassword, dbUserId);
         //重新设置密码后将登录失败表中近30分钟记录置为删除
-        Calendar c = Calendar.getInstance();
-        c.setTime(new Date());
-        c.add(Calendar.MINUTE, -30);
-        loginMapper.updateLoginFailRecord(dbUserId, c.getTime());
+        redisService.remove("login-"+dbUserId);
         return ResponseJson.success("密码修改成功", "");
     }
 

+ 27 - 11
src/main/java/com/caimei365/user/service/impl/LoginServiceImpl.java

@@ -17,6 +17,7 @@ import com.caimei365.user.model.vo.LoginFailRecordVo;
 import com.caimei365.user.model.vo.UserLoginVo;
 import com.caimei365.user.service.LoginService;
 import com.caimei365.user.utils.JwtUtil;
+import com.caimei365.user.utils.MathUtil;
 import com.caimei365.user.utils.Md5Util;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -84,16 +85,19 @@ public class LoginServiceImpl implements LoginService {
         }
         //处理比对密码
         UserLoginVo baseUser = loginMapper.getLoginUserByMobileOrEmail(mobileOrEmail);
-
+        String key = "login-" + baseUser.getUserId();
+        boolean exists = redisService.exists(key);
         if (baseUser != null) {
             //如果30分钟内输入错误记录>=5,return该账号暂时被冻结,请(30-最前一次时间)分钟后重试或直接修改密码
-            Calendar c = Calendar.getInstance();
-            c.setTime(new Date());
-            c.add(Calendar.MINUTE, -30);
-            List<LoginFailRecordVo> fail = loginMapper.findLoginFailRecord(baseUser.getUserId(), c.getTime());
-            if (null != fail && fail.size() >= 5) {
-                Integer minutes = loginMapper.findTimes(fail.get(0).getId(),new Date());
-                return ResponseJson.error("该账号暂时被冻结,请" + (30 - minutes) + "分钟后重试或直接修改密码", null);
+            if (exists) {
+                String val = (String) redisService.get(key);
+                String[] split = val.split(",");
+                int count = Integer.parseInt(split[0]);
+                if (count >= 5) {
+                    long s = Long.parseLong(split[1]);
+                    int l = (int) Math.floor((System.currentTimeMillis() - s) / 1000 / 60);
+                    return ResponseJson.error("该账号暂时被冻结,请" + (30-l) + "分钟后重试或直接修改密码", null);
+                }
             }
             // 如果前端传入unionId,则存入返回前端
             baseUser.setUnionId(unionId);
@@ -110,9 +114,21 @@ public class LoginServiceImpl implements LoginService {
                 }
             } else {
                 // 增加一次错误输入密码记录,30分钟内连续五次冻结
-                loginMapper.insertLoginFailRecord(new Date(),baseUser.getUserId());
-                if (null != fail && 4 ==fail.size() ) {
-                    return ResponseJson.error("您已连续输错5次密码,账号被暂时冻结,请于30分钟后重试或直接修改密码",null);
+                if (exists) {
+                    String val = (String) redisService.get(key);
+                    String[] split = val.split(",");
+                    int count = Integer.parseInt(split[0]);
+                    if (count < 5) {
+                        count++;
+                        String va = count + "," + System.currentTimeMillis();
+                        redisService.set(key, va);
+                    }
+                    if (count >= 5) {
+                        redisService.set(key, 5 + "," + System.currentTimeMillis(), 1800L);
+                    }
+                } else {
+                    String val = 1 + "," + System.currentTimeMillis();
+                    redisService.set(key, val);
                 }
             }
         }