Redis实现登录验证,错误次数超过一定数后锁定账号

 仅贴出关键代码

Jedis jedis = new Jedis("192.168.1.105", 6379);

@Override
public Map loginByUserName(String userName, String password) {
    //根据用户名获取用户信息
    List<Map> list = this.userMapper.selectByUserName( userName );
    if (list.size() == 0) {
        checkUser(userName,1);
    }
    Long userId = Long.valueOf( list.get( 0 ).get( "userId" ).toString() );
    //更新登录次数及最后登录时间
    this.userMapper.updateUserLoginCount( userId, new Date() );
    return login( list, password, userName );
}

public Map login(List<Map> list, String password, String loginId ) {
    Map resultMap = new HashMap();
    if (list.size() == 0) {
        checkUser(loginId,1);
    } else {
        Map<String, Object> userMap = list.get( 0 );
        if (null != password) {//仅loginbyThird没有密码
            if (!password.equals( userMap.get( "password" ) )) {
                checkUser(loginId,1);
            }
            checkUser(loginId,0);
        }
        ...
    }
}


private void checkUser(String loginId,Integer type){
    jedis.auth("123456");
    Boolean exit = jedis.exists(loginId);

    if (exit == true && ("true".equals(jedis.get(loginId)))){
        throw new BusinessException( "该账号已被锁,请确认" );
    }else if (exit == true && "5".equals(jedis.get(loginId))){
        //锁帐号
        jedis.set(loginId, "true");
        //设置半个小时的过期时间
        jedis.expire(loginId, 30 * 60);
        throw new BusinessException( "该账号已被锁,请确认" );
    }else {
        checkNameAndPassword(loginId, type);
    }
}


private void checkNameAndPassword(String loginId, Integer type) {
    if (type == 0) {
        jedis.del(loginId);
        System.out.println("登录成功");
    }else {
        if (jedis.exists(loginId)) {
            jedis.incr(loginId);
        }else {
            jedis.setex(loginId, 300, "1");
        }
        System.out.println("第" + jedis.get(loginId) + "次登录失败");
        throw new BusinessException( "账号密码错误,你还有" + (5-Integer.parseInt(jedis.get(loginId))) + "次机会" );
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值