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