Jboot通过redis实现每日登录失败次数限制的问题
1. 思路
下面是我以前写的代码,没考虑高并发场景。如果是高并发场景下,要考虑到redis的set方法覆盖值问题,可以使用incr来替代get,set保证数据安全
- 通过redis记录登录失败的次数,以用户的username为key
- 每次收到登录的请求时,都去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. 总结
- 这里有个地方要注意,就是redis 设置过期时间后,重新set会清除过期效果, 重新变成永久状态, 所以需要每次都pexpire()
- redis中还有一个方法:
incr()
,每次调用这个方法,都会让一个键的值+1,如果没有这个键,会初始为0再+1. 适合做计数器, 也能再这个案例中使用, 但是我这里只是希望登录失败的时候才计数+1 , 登录之前直接判断count, 所以使用了传统的get(),set(). 有兴趣的同学可以去详细了解.
Jboot通过redis实现每日登录失败次数限制的问题相关推荐
- springboot+redis实现登录失败次数限制
需求:为了防止枚举攻击,完成安全性测试扫描.先是保证账号和密码其一错误但返回错误一致,添加Referer拦截器,现在需要限制登录失败次数限制,本文做的是累计登录失败五次账号锁定3小时.(如果有一次登录 ...
- php限制登陆尝试次数,Laravel登录失败次数限制的实现方法
在用户身份验证的情况下,laravel 具有内置的身份验证系统.我们可以根据要求轻松修改它.身份验证中包含的功能之一是throttling. 为什么我们需要throttling保护? 基本上,thro ...
- linux服务器登录次数,Linux 服务器和Windows服务器 用户登录失败次数限制【互联网金融系统漏洞排查】...
1.Linux服务器用户登录失败次数限制(使用pam模块实现) /etc/pam.d/sshd (远程ssh) /etc/pam.d/login (终端) 1.1.用户通过ssh登录失败次 ...
- ubuntu 配置登录失败次数限制
ubuntu 配置登录失败次数限制 本地登录配置 ssh远程登录配置 测试 本机ssh测试 不同机器测试 本地登录配置 打开 /etc/pam.d/login [sudo] vim /etc/pam. ...
- sqlserver数据库限制用户登录失败次数
gpedit.msc 设定 失败三次之后锁定30分钟,30分钟重置一次 使用数据库的账户登录测试 故意输错三次密码后,提示 解锁锁定的账户 ALTER LOGIN jason WITH PASSWOR ...
- oracle 登录失败次数,Oracle用户连续登录失败次数限制如何取消
当用户连续登录失败次数过多时,Oracle会锁定该用户,"FAILED_LOGIN_ATTEMPTS"用于设置最大次数,超过该值则锁定该帐号. 要取消用户连续登录失败次数的限制可以 ...
- 国产化DM达梦数据库 - 用户状态查询、锁定与解锁,“登录失败次数超过限制”问题解决
达梦数据库密码输入错误达到限制后会被锁定一段时间. An error occurred while establishing the connection:Long Message: 登录失败次数超过 ...
- springMVC结合Shiro实现登录失败次数过多锁定账户功能
本文主要记录了自己遇到了一些坑,以及需要注意的细节 主要部分源码点我 提取码:jwvx 前言 添加依赖等等其他人的教程里都有,就不浪费时间解释了: application-shiro.xml 配置文件 ...
- Oracle:ORA-28000异常(帐户已被锁定),修改账号登录失败次数
问题描述 最近系统更换了数据库服务器,IP地址也变了,于是就把应用服务器中配置数据库连接的位置做了修改,但是修改后应用起不来了. 经过半天也没发现问题,后来想试试连数据库看看,结果PL/SQL提示&q ...
最新文章
- java与工业相机,OpenCV软件与工业相机的组合在机器视觉中的应用
- 达内出来的混得怎么样了_《士兵突击》主演现状:混得最好的不是王宝强,而是一向低调的他...
- python assert 断言的作用
- python中frame用法_python操作dataFrame基本知识点
- redis 内存不足 排查_排查redis占用内存达90%以上
- 使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之一...
- 微信时代计算机教学,互联网+时代技工院校计算机教学方式研究
- java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
- SQL2008安装后激活方式以及提示评估期已过解决方法
- 《流畅的Python第二版》读书笔记——字典和集合
- 写一篇文章需要多长时间?
- php留言板制作模板,简单5步,制作wordpress留言板
- 数据结构(十四)——二叉树
- matlab如何插入“埃”这个符号
- 头条小程序服务器设置,今日头条小程序如何注册申请
- 学1个月爬虫就月赚6000?告诉你爬虫的真实情况!
- ORAN C平面 Section Extension 10
- 西门子——不同数据的存储方式
- 基于web的家庭理财系统
- WebService 深入详解