前提须知:登陆拦截器 此演示:登陆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秒以后 输入正确密码即可登陆