1. 思路

下面是我以前写的代码,没考虑高并发场景。如果是高并发场景下,要考虑到redis的set方法覆盖值问题,可以使用incr来替代get,set保证数据安全

  1. 通过redis记录登录失败的次数,以用户的username为key
  2. 每次收到登录的请求时,都去redis查询登录次数是否已经大于等于我们设置的限制次数, 是的话直接返回

2. 代码

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

2.1 controller

我这里使用的Jboot, 获取redisTemplate的方式是Jboot.me().getRedis(), spring的话用jedisTemplate就行.

 // 如果用户输入账号密码有效登录超过限制次数,24小时禁止登录// 设置一天限制失败次数,默认为10次final int limit = 3;JbootRedis jr = Jboot.me().getRedis();//Constants.LOGIN_COUNT = "LOGIN_COUNT"//account是页面传过来的usernameString key = Constants.LOGIN_COUNT + "_" + account;Integer count = jr.get(key);if(count == null){count = 0;}else {if (count >= limit) {//直接返回ajaxJson.setMsg("您今天登录失败的次数已经超过限制,请明天再试。");ajaxJson.setSuccess(false);logger.error("账号为【"+account+"】的用户单日登录次数超过上限");render(callback, gson.toJson(ajaxJson));return;}}//... 去数据库根据username查询user对象if (user != null) {// 往redis中增加登录失败的次数Integer newCount = IncrFailLoginCount(key,count);logger.error("账号为【"+account+"】的用户登录失败,"+ajaxJson.getMsg());ajaxJson.setMsg(ajaxJson.getMsg() + ",剩下登录次数为:"+(limit-newCount));render(callback, gson.toJson(ajaxJson));return;}else{// 登录成功,清除redis失败记录jr.del(key);}

2.2 IncrFailLoginCount方法

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

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

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

3. 总结

  1. 这里有个地方要注意,就是redis 设置过期时间后,重新set会清除过期效果, 重新变成永久状态, 所以需要每次都pexpire()
  2. redis中还有一个方法:incr(),每次调用这个方法,都会让一个键的值+1,如果没有这个键,会初始为0再+1. 适合做计数器, 也能再这个案例中使用, 但是我这里只是希望登录失败的时候才计数+1 , 登录之前直接判断count, 所以使用了传统的get(),set(). 有兴趣的同学可以去详细了解.

Jboot通过redis实现每日登录失败次数限制的问题相关推荐

  1. springboot+redis实现登录失败次数限制

    需求:为了防止枚举攻击,完成安全性测试扫描.先是保证账号和密码其一错误但返回错误一致,添加Referer拦截器,现在需要限制登录失败次数限制,本文做的是累计登录失败五次账号锁定3小时.(如果有一次登录 ...

  2. php限制登陆尝试次数,Laravel登录失败次数限制的实现方法

    在用户身份验证的情况下,laravel 具有内置的身份验证系统.我们可以根据要求轻松修改它.身份验证中包含的功能之一是throttling. 为什么我们需要throttling保护? 基本上,thro ...

  3. linux服务器登录次数,Linux 服务器和Windows服务器 用户登录失败次数限制【互联网金融系统漏洞排查】...

    1.Linux服务器用户登录失败次数限制(使用pam模块实现) /etc/pam.d/sshd    (远程ssh) /etc/pam.d/login    (终端) 1.1.用户通过ssh登录失败次 ...

  4. ubuntu 配置登录失败次数限制

    ubuntu 配置登录失败次数限制 本地登录配置 ssh远程登录配置 测试 本机ssh测试 不同机器测试 本地登录配置 打开 /etc/pam.d/login [sudo] vim /etc/pam. ...

  5. sqlserver数据库限制用户登录失败次数

    gpedit.msc 设定 失败三次之后锁定30分钟,30分钟重置一次 使用数据库的账户登录测试 故意输错三次密码后,提示 解锁锁定的账户 ALTER LOGIN jason WITH PASSWOR ...

  6. oracle 登录失败次数,Oracle用户连续登录失败次数限制如何取消

    当用户连续登录失败次数过多时,Oracle会锁定该用户,"FAILED_LOGIN_ATTEMPTS"用于设置最大次数,超过该值则锁定该帐号. 要取消用户连续登录失败次数的限制可以 ...

  7. 国产化DM达梦数据库 - 用户状态查询、锁定与解锁,“登录失败次数超过限制”问题解决

    达梦数据库密码输入错误达到限制后会被锁定一段时间. An error occurred while establishing the connection:Long Message: 登录失败次数超过 ...

  8. springMVC结合Shiro实现登录失败次数过多锁定账户功能

    本文主要记录了自己遇到了一些坑,以及需要注意的细节 主要部分源码点我 提取码:jwvx 前言 添加依赖等等其他人的教程里都有,就不浪费时间解释了: application-shiro.xml 配置文件 ...

  9. Oracle:ORA-28000异常(帐户已被锁定),修改账号登录失败次数

    问题描述 最近系统更换了数据库服务器,IP地址也变了,于是就把应用服务器中配置数据库连接的位置做了修改,但是修改后应用起不来了. 经过半天也没发现问题,后来想试试连数据库看看,结果PL/SQL提示&q ...

最新文章

  1. java与工业相机,OpenCV软件与工业相机的组合在机器视觉中的应用
  2. 达内出来的混得怎么样了_《士兵突击》主演现状:混得最好的不是王宝强,而是一向低调的他...
  3. python assert 断言的作用
  4. python中frame用法_python操作dataFrame基本知识点
  5. redis 内存不足 排查_排查redis占用内存达90%以上
  6. 使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之一...
  7. 微信时代计算机教学,互联网+时代技工院校计算机教学方式研究
  8. java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
  9. SQL2008安装后激活方式以及提示评估期已过解决方法
  10. 《流畅的Python第二版》读书笔记——字典和集合
  11. 写一篇文章需要多长时间?
  12. php留言板制作模板,简单5步,制作wordpress留言板
  13. 数据结构(十四)——二叉树
  14. matlab如何插入“埃”这个符号
  15. 头条小程序服务器设置,今日头条小程序如何注册申请
  16. 学1个月爬虫就月赚6000?告诉你爬虫的真实情况!
  17. ORAN C平面 Section Extension 10
  18. 西门子——不同数据的存储方式
  19. 基于web的家庭理财系统
  20. WebService 深入详解

热门文章

  1. 基于Redis的限流器的实现
  2. 深度搜索(DFS)和广度搜索(BFS)
  3. 数据治理管理平台——数据资产管理
  4. 微信上一定有重做贴吧的机会!
  5. 《俪影2046》v2.09 完美破解
  6. 掌门优课用户量增多,用户看上了它什么?
  7. 信息化、数字化、数智化
  8. 滑雪问题(dfs+dp)
  9. 计算机软件硬件结构造图,个人计算机的存储器系统 说说内核与计算机硬件结构(3)...
  10. 使用vue-video-player实现直播