基于复述,如何实现每日登录失败次数限制的方法

  介绍

这篇文章主要介绍基于复述,如何实现每日登录失败次数限制的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

<强> 1。思路

下面是我以前写的代码,没考虑高并发场景。如果是高并发场景下,要考虑到复述的设置方法覆盖值问题,可以使用增加来替代,集保证数据安全

通过复述,记录登录失败的次数,以用户的用户名为关键

每次收到登录的请求时,都去复述,查询登录次数是否已经大于等于我们设置的限制次数,是的话直接返回

<强> 2。代码

前台登录和后台查询数据库的代码省略

<强> 2.1控制器

我这里使用的Jboot,获取redisTemplate的方式是<代码> Jboot.me () .getRedis() ,春天的话用jedisTemplate就行。

//,如果用户输入账号密码有效登录超过限制次数,24小时禁止登录
  ,//设置一天限制失败次数,默认为10次
  ,final  int  limit =, 3;
  ,JbootRedis  jr =, Jboot.me () .getRedis ();
  ,//Constants.LOGIN_COUNT =,“LOGIN_COUNT"
  ,//账户是页面传过来的用户名
  ,String  key =, Constants.LOGIN_COUNT  +,“_", +,账户;
  ,Integer  count =, jr.get(关键);
  ,如果(count ==, null) {
  ,,count =, 0;
  ,}else  {
  ,,if  (count 祝辞=,限制),{
  ,,,,//直接返回
  ,,,,ajaxJson.setMsg(“您今天登录失败的次数已经超过限制,请明天再试!”);
  ,,,,ajaxJson.setSuccess(假);
  ,,,,logger.error(“账号为【“+描述+“】的用户单日登录次数超过上限“);
  ,,,,渲染(回调,gson.toJson (ajaxJson));
  ,,,,返回;
  ,,}
  ,}//?去数据库根据用户名查询用户对象
  ,if  (user  !=, null), {//,,,往复述中增加登录失败的次数
  ,,Integer  newCount =, IncrFailLoginCount(键,数);
  ,,logger.error(“账号为【“+描述+“】的用户登录失败,“+ ajaxJson.getMsg ());
  ,,ajaxJson.setMsg (ajaxJson.getMsg(), +,“,剩下登录次数为:“+ (limit-newCount));
  ,才能呈现(回调,gson.toJson (ajaxJson));
  ,才能回报;
  ,其他}{
  ,,//,登录成功,清除复述,失败记录
  ,,jr.del(关键);
  以前,} 

<强> 2.2 IncrFailLoginCount方法

/* *   ,*一天中登录失败的次数统计   ,* @param  key 复述中存储的键   ,* @param  count 已经登录失败的次数   ,* @return  count 登录失败次数   ,*/private  Integer  IncrFailLoginCount (String 关键,Integer 计数),{   JbootRedis 才能;jr =, Jboot.me () .getRedis ();   数才能+ +;//才能设置过期时间为今晚23点59分59秒   long 才能;timeInMillis =, DateUtils.getMillsecBeforeMoment(23日,59岁,59岁,999年);   if 才能;(timeInMillis  & lt;, 100) {   ,,,//,避免在最后一秒的时候登录导致过期时间过小甚至为负数   ,,,timeInMillis =, 1000 * 60;   ,,}//才能,设置过期时间   jr.set才能(键,数);//这才能里注意顺序,,先设置再pexpire   jr.pexpire才能(关键,timeInMillis);   return 才能;计算;   }

这里用到了时间的一个工具类,具体代码如下:

/* *   *,获取当前时间到指定时刻前的毫秒数   *,@param  hour 指定时刻的小时   *,@param  min 指定时刻的分钟   *,@param  sec 指定时刻的秒   *,@param  mill 指定时刻的毫秒   *,@return   */public  static  long  getMillsecBeforeMoment (int  int  int 小时,分钟,秒,int 轧机){   return 才能getMillisecBetweenDate (new 日期(),getMoment(小时、分钟、秒,轧机));   }/* *   *,获取两个日期之间的毫秒数   之前,* @param    ,* @param 之后   ,* @return   ,*/public  static  long  getMillisecBetweenDate (Date 之前,Date 后){   ,long  beforeTime =, before.getTime ();   ,long  afterTime =, after.getTime ();   ,return  afterTime 安康;从前;   }/* *   *,获取当天的某一时刻日期   ,* @param  hour  24小时   ,* @param  min 分钟   ,* @param  sec 秒   ,* @param  mill 毫秒   ,* @return   ,*/public  static  Date  getMoment (int  int  int 小时,分钟,秒,int 轧机){   ,Calendar  Calendar =, Calendar.getInstance ();   ,calendar.setTime (new 日期());   ,calendar.set (Calendar.HOUR_OF_DAY、小时);   ,calendar.set (Calendar.MINUTE、最小值);   ,calendar.set (Calendar.SECOND, sec);   ,calendar.set (Calendar.MILLISECOND机);   ,return  calendar.getTime ();   }

基于复述,如何实现每日登录失败次数限制的方法