在管制层进行拜访拦挡也是咱们在我的项目中常会遇到的需要,例如:我的项目中要求零碎登录操作有工夫限度--12306购票工夫的限度等.
对于这类需要咱们个别有几种抉择:
- 过滤器Filter
- AOP
- SpringMVC拦截器...
本文咱们次要说一下SpringMVC拦截器的实现
原理
Spring MVC的拦截器是基于回调机制,能够在指标办法执行之前/之后,做一些解决.
如下图所示:
客户端的申请通过前端控制器会被HandleInterceptor拦截器拦挡,会依据拦截器的办法(preHandle/postHandle),别离在Controller层的指标办法之前或之后只写一些业务.
实现
咱们要实现的是登录前的拦挡,而后进行工夫断定--所以咱们须要用preHandle办法,能够在指标办法执行之前,先进行业务检测,满足条件则放行,不满足条件则进行拦挡
具体实现分为两步:
- 定义拦截器:
public class TimeAccessInterceptor implements HandlerInterceptor{ /** 此办法会在你的指标Controller执行之前执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("==preHandler=="); LocalDateTime now = LocalDateTime.now();//JDK8的新个性 int hour = now.getHour(); System.out.println("hour:"+hour); if(hour<9||hour>19) throw new ServiceException("不在拜访工夫:9~14");//return false return true;//true示意放行,false示意申请到此结束 }}
咱们本人创立一个类并且实现HandlerInterceptor拦截器接口,而后依据你的业务需要实现办法,咱们这里实现的是preHandle办法用于在controller执行之前执行,通过JDK8的新个性--LocalDateTime.now()来获取以后工夫,能够再通过now.getHoure()等办法来获取具体的小时/分钟/秒等.在判断是否在咱们禁止登陆的工夫范畴内,如果是则抛出异样(这里ServiceException是咱们本人定义的异样类),抛出异样==return false,返回值return true示意放行,false示意拦挡完结.
- 对拦截器进行配置
@Configurationpublic class SpringWebConfig implements WebMvcConfigurer { /** * 注册拦截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TimeAccessInterceptor()) .addPathPatterns("/user/doLogin"); }}
创立一个SpringWebConfig类并且实现WebMvcConfigurer接口,类由@Configuration注解形容,示意是一个配置类,重写实现类中的addInterceptors办法,参数InterceptorRegistry registry拦截器汇合,调用addInterceptor(new TimeAccessInterceptor())向其中增加咱们定义的拦截器类,在调用addPathPatterns("/user/doLogin"),增加要拦挡的门路,()内就是咱们登陆的门路.