基于HashMap实现(用户登录三次失败后)24小时之内限制登录!

简介:

       近期在改一个老项目(struts1做的),客户现在想实现如下效果,用户在登录失败三次之后,锁定用户,需要信息部管理人员进行解锁!我第一想法,是在其数据库User表中加一个字段,记录登录失败的次数,但是数据库添加字段需要远程操作数据库,而对方的数据库又被各种加密软件包围!不是很方便,所以想了一下解决方案,利用Map来进行处理!

       首先说一个思路,新建实体类,只有两个属性,登录失败次数,登录时间,实现get,set方法!

如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  class  UserErrorLoginRecord {
     private  String loginTime;
     private  int  errorNumber;
     public  String getLoginTime() {
         return  loginTime;
     }
     public  void  setLoginTime(String loginTime) {
         this .loginTime = loginTime;
     }
     public  int  getErrorNumber() {
         return  errorNumber;
     }
     public  void  setErrorNumber( int  errorNumber) {
         this .errorNumber = errorNumber;
     }
}


 第二步:  我们在登录login.action中new一个新的Map出来,如下


1
rivate  static  Map<String, UserErrorLoginRecord> LOG_MAP =  new  HashMap<String, UserErrorLoginRecord>();


创建时间日历  

1
Calendar nowDate = Calendar.getInstance();


当用户登录发出login.action之后,那么



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
                     UserErrorLoginRecord userError =  null ;
                     String account = loginForm.getAccount(); //用户名
                     String password = loginForm.getPassword(); //密码
                     userError = LOG_MAP.get(account); //通过用户名获取登录信息对象
                     if  (userError ==  null ) {
                         //如果查询出来的user对象为空,那么直接到user==null这个方法
                         user =  this .usersService.checkLoginIn(account, MD5.generate(password));
                     else  {
                         String loginTime = userError.getLoginTime();
                         int  loginNumber = userError.getErrorNumber();
                         //获取时间
                         String dateStr = String.valueOf(nowDate.get(Calendar.YEAR)) + (nowDate.get(Calendar.MONTH) +  1 ) + (nowDate.get(Calendar.DAY_OF_MONTH));
                         //如果现在不等于Map中存的登录时间(20140401)这种格式,那么显然时间已经过了24小时,那么根据用户名直接清除Map中的登录信息
                         if  (!dateStr.equals(loginTime)) {
                             LOG_MAP.remove(account);
                             user =  this .usersService.checkLoginIn(account, MD5.generate(password));
                             //否则就是判断如果登录次数小于3那么允许其查询user对象,否则直接将user设为空
                         else  {
                             if  (loginNumber <  3 ) {
                                 user =  this .usersService.checkLoginIn(account, MD5.generate(password));
                             else  {
                                 user =  null ;
                             }
                         }
                     }
                     //用户为空
                     if  (user ==  null ) {
                         String dateStr = String.valueOf(nowDate.get(Calendar.YEAR)) + (nowDate.get(Calendar.MONTH) +  1 ) + (nowDate.get(Calendar.DAY_OF_MONTH));
                         userError = LOG_MAP.get(account);
                         if  (userError ==  null ) {
                             userError =  new  UserErrorLoginRecord();
                             userError.setErrorNumber( 1 );
                             userError.setLoginTime(dateStr);
                             LOG_MAP.put(account, userError);
                         else  {
                             int  loginNumber = userError.getErrorNumber();
                             userError.setErrorNumber(loginNumber +  1 );
                             LOG_MAP.put(account, userError);
                         }
                         userError = LOG_MAP.get(account);
                         if  (userError.getErrorNumber() <  4 ) {
                             request.setAttribute( "errorloginmessage" "对不起,您的登陆失败["  + userError.getErrorNumber() +  "]。您无权限访问该系统,或是用户名和密码不匹配!" );
                         else  {
                             request.setAttribute( "errorloginmessage" "对不起,您的登陆失败次数太多,系统已经不允许您继续登陆,请联系管理员,或明天在尝试登陆!" );
                         }
                     }
                 }
                 if  (user !=  null ) {
//可以清除登录错误信息,也可以不清除
//                  LOG_MAP.remove(user.getAccount());
                     UserSession us =  new  UserSession();
                     us.setUserID(user.getUserId().toString());
                     us.setUserName(user.getName());
                     us.setVipUser( true );
                     us.setLoginTime(Calendar.getInstance().getTime());
                     us.setAccount(user.getAccount());
                     us.setClientIP(request.getRemoteAddr());
                     Set set = user.getSfmUserDepartRels();
                 return  success
                 }
                 return  error;


至于,系统管理员怎么解锁账号,其实很简单,那就是在后台,将用户账号带着(这个应该不难吧)写一个方法!

1
2
3
4
5
6
userError = LOG_MAP.get(account1); //传过来的用户名
                 if (userError!= null ){
                 int   errNumber =userError.getErrorNumber();
                 if (errNumber!= 0 ){
                      LOG_MAP.remove(account1);
                 }


       OK,到这里,基本上完成了用户的需求,至于漏洞,那就是服务器重启之后,登录失败信息就会消失,但是,项目上线之后除了非正常情况及需要维护情况下,服务器基本上不会停止的,所以,此方法还是可行的!











本文转自 小夜的传说 51CTO博客,原文链接:http://blog.51cto.com/1936625305/1412726,如需转载请自行联系原作者
目录
相关文章
|
缓存 安全 Java
JAVA实现用户登录错误N次后,账户暂时锁定
JAVA实现用户登录错误N次后,账户暂时锁定
528 0
JAVA实现用户登录错误N次后,账户暂时锁定
|
11天前
|
存储 监控 NoSQL
使用Redis的Bitmap统计一周连续登录的用户
使用Redis的Bitmap统计一周连续登录的用户
8 1
|
7月前
|
数据安全/隐私保护
session登录优化和访问次数记录
session登录优化和访问次数记录
46 0
登录next cloud出现,“我们检测到您的 IP 进行了多次无效登录尝试。因此,你的下一次登录最长会延迟30秒。”问题解决
登录next cloud出现,“我们检测到您的 IP 进行了多次无效登录尝试。因此,你的下一次登录最长会延迟30秒。”问题解决
536 0
登录next cloud出现,“我们检测到您的 IP 进行了多次无效登录尝试。因此,你的下一次登录最长会延迟30秒。”问题解决
【JavaWeb】【Cookie】通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆
【JavaWeb】【Cookie】通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆
231 0
使用cookie来记录用户登录次数,为何次数不更新
使用cookie来记录用户登录次数,为何次数不更新
|
数据安全/隐私保护
限制登录密码错误次数,比如重试5次密码都失败就锁住用户2小时
限制登录密码错误次数,比如重试5次密码都失败就锁住用户2小时
|
数据安全/隐私保护 索引
登陆操作:用户名和密码及进行录入判断 当用户名是li 密码是123456的时候显示登陆成功 。如果密码和用户名录入错需要循环录入。 并且录入错误次数超过三次提示:账号已锁。并且停掉循环
登陆操作:用户名和密码及进行录入判断 当用户名是li 密码是123456的时候显示登陆成功 。如果密码和用户名录入错需要循环录入。 并且录入错误次数超过三次提示:账号已锁。并且停掉循环
|
安全 JavaScript 算法
「实用教程」登录失败超过一定次数如何锁定帐号?
初学shiro,shiro提供了一系列安全相关的解决方案,根据官方的介绍,shiro提供了"身份认证"、"授权"、"加密"和"Session管理"这四个主要的核心功能。
3612 0