一、为啥使用redis来限制密码输入次数

使用mysql等关系型数据库也可以完成禁用,但是没有定时的功能,而redis数据库自带的定时删除功能。

二、实现思路

用户输入密码错误后,就自动在redis数据库中增加一条数据,数据内容为key+value,key是用户名,value是错误次数,每次出错,更新value,直到value等于3,给这个键值对加上失效时间即可。

登陆的时候需要判断用户的value是否为3,如果为3查出失效时间返回给前台

三、代码实现

只拿出service层的代码:

 /**
  *  @author: wsq
  *  @Date: 2020/7/22 12:30
  *  @Description: 用户登陆模块,三次输入错误禁用2小时
  */
    public String login(Map<String, Object> map){
        // 判断该账号是否存在
        Map<String, Object> admin = redisMapper.login(map);
        if(admin == null){
          return "此账号不存在!";
        }
        // 判断账号是否已经禁用
        int failCount = 0;
        if(redisTemplate.opsForValue().get(map.get("account").toString()+"FailCount") != null){
            failCount = Integer.parseInt(redisTemplate.opsForValue().get(map.get("account").toString()+"FailCount").toString());
        }
        if(failCount == 3){
            long lockTime = redisTemplate.getExpire(map.get("account").toString()+"FailCount");
            return "此账号已被禁用,禁用剩余时间为:"+lockTime+"秒";

        }
        // 判断用户名密码是否正确
        if (!(admin.get("password").toString().equals(map.get("password").toString()))){
            redisTemplate.opsForValue().set(map.get("account")+"FailCount",++failCount);
            if(failCount == 3){
                redisTemplate.opsForValue().set(map.get("account")+"FailCount",failCount,60*60*2, TimeUnit.SECONDS);
                return "此账号已被禁用,禁用时间为2个小时!";
            }
            return "输入密码错误,请重新输入,你可以再次尝试的次数为:"+ (3 - failCount);
        }
        return "登陆成功";
    }