zoukankan      html  css  js  c++  java
  • StringBoot+redis-用户登陆限制密码输入次数(超出后禁用两个小时)

    一、为啥使用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 "登陆成功";
        }
  • 相关阅读:
    斐波拉契数列
    判断润年
    欧拉回路
    走迷宫
    八连块问题
    知道一棵二叉树的前序和中序序列求二叉树的后续序列
    判断一个顺序排列的栈的输出序列
    Number Sequence
    如何去设计一个自适应的网页设计或HTMl5
    position
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13360026.html
Copyright © 2011-2022 走看看