- 前提须知:登陆拦截器
- 此演示:登陆5次错误 则限制登陆时长5秒
业务层实现方法
- 在控制器中使用此方法,若判断用户账户和密码是否正确则返回用户对象
- 定义session中的key为’count’
- 定义一个日期对象存放时间,时间是当前时间的后5秒,将此时间存放进session中key为’time’中
- 若登陆账号失败(账号或者密码有误),则将’count’累加一次
- 累加达到5次之后开始禁止登陆(账号密码输入正确也无法进入),只有当时间过了5秒后,也就是抵达session的key为’time’的时间,就清理session, 清理完以后才可以重新输入正确密码登陆
public Employee login(String username, String password) {
HttpSession session = UserContext.getSession();
if (session.getAttribute("count") == null) {
session.setAttribute("count", 0);
}
if ((Integer) session.getAttribute("count") >= 5) {
if (new Date().after((Date) session.getAttribute("time"))) {
session.invalidate();
}
throw new LoginException("登陆次数过多,暂被禁止登陆,请稍后再试");
}
Calendar instance = Calendar.getInstance();
instance.setTime(new Date());
instance.add(Calendar.SECOND, 5);
Date time = instance.getTime();
session.setAttribute("time", time);
if (!StringUtils.hasText(username)) {
session.setAttribute("count", (Integer) session.getAttribute("count") + 1);
throw new LoginException("用户名不能为空");
}
if (!StringUtils.hasText(password)) {
session.setAttribute("count", (Integer) session.getAttribute("count") + 1);
throw new LoginException("密码不能为空");
}
Employee employee = employeeMapper.selectByUsernameAndPassword(username, password);
if (employee == null) {
session.setAttribute("count", (Integer) session.getAttribute("count") + 1);
throw new LoginException("账号或密码错误");
}
return employee;
}
控制器
- 这里抽取了存放session对象的类UserContext
- 这里获取了此用户所有的权限给拦截器判断,不懂请跳转至:权限注解和权限拦截器
效果图
- 输入错误密码5次以内
- 输入错误密码5次以后
- 只有过多5秒以后 输入正确密码即可登陆