JAVA用户名密码输入错误3次,锁定账号30分钟简单实现(不操作数据库)

public Object login(User user,HttpSession session) throws Exception {
        String username = user.getUsername();
        String password = user.getPassword();
        if(!checkLock(session, username)) {
            throw new CustomException(StatusCode.ERROR_CODE,"该账号已被锁定");
        }
        if (StringUtils.isEmpty(username)||StringUtils.isEmpty(password)) {
            throw new CustomException(StatusCode.ERROR_CODE, "用户名和密码不能为空!");
        }
        User  u = getByUsername(username);
        if (u == null) {
            throw new CustomException(StatusCode.ERROR_CODE, "用户名不存在!");
        }
        if(!MD5Util.checkpassword(password, u.getPassword())) {
            //新增登录失败记录
            addFailNum(session, username);
            throw new CustomException(StatusCode.ERROR_CODE, "用户名或密码错误!");
        }
      //清空登录失败记录
        cleanFailNum(session, username);
 
    ......
}
/**
     * 校验用户登录失败次数
     * @param session
     * @param username
     * @return
     */
    public boolean checkLock(HttpSession session,String username) {
        Object o = session.getServletContext().getAttribute(username);
        if(o==null) {
            return true;
        }
        HashMap<String,Object> map  = (HashMap<String, Object>) o;
        int num  = (int) map.get("num");
        Date date = (Date) map.get("lastDate");
        long timeDifference = ((new Date().getTime()-date.getTime())/60/1000);
        if(num>=3&&timeDifference<30) {
            return false;
        }
        return true;
    }
    /**
     * 新增用户登录失败次数
     * @param session
     * @param username
     */
    public void addFailNum(HttpSession session, String username) {
        Object o = session.getServletContext().getAttribute(username);
        HashMap<String,Object> map = null;
        int num= 0;
        if(o==null) {
            map = new HashMap<String,Object>();
        }else {
            map  = (HashMap<String, Object>) o;
             num  = (int) map.get("num");
             Date date = (Date) map.get("lastDate");
             long timeDifference = ((new Date().getTime()-date.getTime())/60/1000);
             if(timeDifference>=30) {
                 num=0;
             }
        }
        map.put("num", num+1);
        map.put("lastDate", new Date());
        session.getServletContext().setAttribute(username, map);
    }
    /**
     * 清理用户登录失败的记录
     * @param session
     * @param username
     */
    public void cleanFailNum(HttpSession session, String username) {
        session.getServletContext().removeAttribute(username);
    }
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下Java代码实现账号登录失败超过五锁定账号30分钟的功能: 1. 首先,需要在用户对象中添加一个字段,用于记录用户登录失败的数以及最后一登录失败的时间: ```java public class User { private String username; private String password; private int loginFailCount; private long lastLoginFailTime; // 省略 getter 和 setter 方法 } ``` 2. 然后,在用户登录失败的方法中,判断用户的登录失败数是否超过五,如果超过五,则更新用户的登录失败时间和失败数,并判断当前时间与上一登录失败时间的时间差是否大于30分钟,如果大于30分钟,则重置用户的登录失败数和时间,否则锁定账号并返回错误信息: ```java public String login(String username, String password) { User user = getUserByUsername(username); if (user == null || !user.getPassword().equals(password)) { // 用户名密码错误 user.setLoginFailCount(user.getLoginFailCount() + 1); user.setLastLoginFailTime(System.currentTimeMillis()); if (user.getLoginFailCount() >= 5) { long timeDiff = System.currentTimeMillis() - user.getLastLoginFailTime(); if (timeDiff < 30 * 60 * 1000) { // 锁定账号 return "账号已被锁定,请30分钟后再试。"; } else { user.setLoginFailCount(0); user.setLastLoginFailTime(0); } } return "用户名密码错误。"; } else { // 登录成功 user.setLoginFailCount(0); user.setLastLoginFailTime(0); return "登录成功。"; } } ``` 以上代码实现了当用户登录失败数超过五后,如果距离上一登录失败时间不足30分钟,则锁定账号,否则重置登录失败数和时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值