d小旭

java做帐户登录失败锁定

对于连续失败登录应用系统5次的帐号,需锁定该帐号至少30分钟不允许登录。

这里也用简单的map集合进行判定,功能能实现,但并不是很完美,不用更改数据库的表字段

1、首先建立一个用户登陆失败的实体类

public class UserErrorLoginRecord {

    //登录时间
    private Date longinTime;
    //错误次数
    private Integer errorNum;

}

2、再登陆的contorller里

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

3、再判断用户登陆系统的具体方法里

UserErrorLoginRecord userError = null;

boolean flag = true;  //默认每次进入都是true,当输入失败5次后,设置为false,直接锁定当前账户30分钟。

用户每次登陆失败就进行存储一次,如下

      userError = LOG_MAP.get(username);
                 if (userError == null) {
                     userError = new UserErrorLoginRecord();
                     userError.setErrorNum(1);
                     userError.setLonginTime(new Date());
                     LOG_MAP.put(username, userError);
                 }else{
                     int loginNumber = userError.getErrorNum();
                     userError.setErrorNum(loginNumber + 1);
                     LOG_MAP.put(username, userError);                    
                 }
                 userError = LOG_MAP.get(username);
                 if(userError.getErrorNum() < 4){
                     map.put("msg","用户名密码错误");
                 }else{
                     map.put("msg","对不起,您的账户已锁定,请于30分钟后再试");
                 }

每次进入登陆方法时候先判断当前用户的登陆错误次数,

        minute = DateUtil.compareDate(new Date(), userError.getLonginTime());  //判断当前登录时间跟上次登录时间相差分钟数
                        if(userError.getErrorNum() > 4){
                            if(minute <= 30){
                                flag = false;
                            }else{
                              这里还是写判定当前账户是否正确的代码

           LOG_MAP.remove(user.getUsername()); //登陆成功后,将此账户的错误记录从map里移除

           之后进行正常登陆成功后的页面跳转
                            }
                        }else{
                            这里还是写判定当前账户是否正确的代码

         LOG_MAP.remove(user.getUsername()); //登陆成功后,将此账户的错误记录从map里移除

         之后进行正常登陆成功后的页面跳转
                        }    

原理很容易理解,这里贴出了部分代码,又不懂的可以评论随时回复解答。

其实可以借助redis实现下过会更好。  

posted on 2017-03-30 10:35  d小旭  阅读(1440)  评论(0编辑  收藏  举报

导航