用Redis实现限制登录功能案例

限制登录功能

需求描述:

用户在2分钟内,仅允许输入错误密码5次。
如果超过次数,限制其登录1小时。(要求每登录失败时,都要给相应提式)

service层

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;


    @Override
    public int login(String username, String password) {

        //判断用户名是否存在
        if(!redisTemplate.hasKey(username)){
            return 3800;
        }

        //判断当前用户是否被限制,若被限制,返回剩余限制时间
        if(redisTemplate.hasKey("username"+username)){
            long time = redisTemplate.opsForValue().getOperations().getExpire("username" + username);
            return (int) time;
        }

        //根据用户名获取密码
        String pwd = redisTemplate.opsForValue().get(username);
        //判断数据库中是否有登录次数标记,如果没有说明当前用户还没有登录过,将次数设置为5次,时间设置为2分钟
        if(!redisTemplate.hasKey("count"+username)){
            redisTemplate.opsForValue().set("count"+username,"3675");
            redisTemplate.opsForValue().set("counttime"+username,"",2,TimeUnit.MINUTES);
        }

        //判断当前用户2分钟内是否已经输了五次密码,没有输到五次,则重置2分钟内可登录5次
        if(!redisTemplate.hasKey("counttime"+username)){
            redisTemplate.opsForValue().set("count"+username,"3675");
            redisTemplate.opsForValue().set("counttime"+username,"",2,TimeUnit.MINUTES);
        }

        //如果密码一致,就删除次数的记录和2分钟的时间记录
        if(password.equals(pwd)){
            redisTemplate.delete("count"+username);
            redisTemplate.delete("counttime"+username);
            return 3665;
        }else{
            //如果密码不一致,计数器减一
            redisTemplate.opsForValue().decrement("count"+username);
            String count = redisTemplate.opsForValue().get("count"+username);
            //如果输入五次不正确,添加当前用户被限制登录1小时的倒计时,并且删除次数标记和2分钟时间标记
            if(count.equals("3670")){
                redisTemplate.delete("count"+username);
                redisTemplate.delete("counttime"+username);
                redisTemplate.opsForValue().set("username"+username,"",60,TimeUnit.MINUTES);
            }
            return Integer.parseInt(count);

        }
    }
}

controller层

@Controller
public class LoginController {

    @Autowired
    private LoginService loginService;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @RequestMapping("login")
    public String login(){
        return "login";
    }


    @ResponseBody
    @RequestMapping("checkLogin")
    public int checkLogin(String username, String password){
        int i = loginService.login(username, password);
        return i;
    }

}

前端ajax

<script type="text/javascript">
  function binding(){

    var username = $.trim($('#username').val());
    var password = $.trim($('#password').val());
    $.ajax({
      type:"post",
      url:"/checkLogin",
      data:{"username":username,"password":password},
      success:function (i) {
        if(i==3665){
          alert("登录成功")
        }else if(i>=3670&&i<3675){
          if(i==3670){
            alert("您已经五次登录失败,一小时内不允许登录")
          }else{
            alert("登录失败,您还有"+(i-3670)+"次机会")
          }
        }else if(i==3800){
          alert("对不起,用户名不存在")
        }else{
          alert("您还有"+i+"秒时间限制")
        }
      }
    })
  }

</script>

至于返回值建议返回String,返回int不太好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值