1、概念
拦截器是由Spring提供,类似Filter功能的类,它可以拦截DispatcherServlet分发的请求。
与Filter不同之处在于,Filter适用于所有Servlet,而拦截器(Interceptor)只适用于DispatcherServlet分发的请求。当同时有Filter,Interceptor存在的情况下,请求的执行链如下:
Filter chain---->DispatcherServlet的doService方法------>获取HandlerExecutionChain,执行HandlerInterceptor chain----->Controller中的handler方法。
2、HandlerInterceptor接口
HandlerInterceptor有三个方法,
- preHandle:在Controller的handler方法之前执行,返回true时继续执行下一个Handler,若是最后一个Handler,则执行Controller中的方法。返回false时,表示请求终止,不会有任何后续。
- postHandle:在Controller的handler方法之后执行,当响应类型为数据流时,即直接向response对象的输出流写入数据时,例如调用response.getWriter.append方法,标注有@ResponseBody的handler。此方法不会执行。
- afterCompletion:在请求结束,响应关闭,线程资源被回收之后运行
3、使用
使用拦截器有两个步骤:
- 自定义HandlerInterceptor接口的实现类,例如TestInterceptor。
- 注册HandlerInterceptor,注册的方式有两种,代码方式,在配置文件中配置。
编写HandlerInterceptor接口的实现类较为简单。只做练习的话,打印几条输出语句即可。
注册的代码方式:
实现WebMvcConfigurer接口,重写addInterceptors方法,参数为InterceptorRegistry,它是拦截注册器。代码如下:
public void addInterceptors(InterceptorRegistry registry) { // 调用InterceptorRegistry的addInterceptor方法 // 拦截所有的请求,除login registry.addInterceptor(new TestInterceptor()). addPathPatterns("/**").excludePathPatterns("/login"); }
注册的配置方式:在spring-mvc.xml中配置mvc:interceptors标签
<mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/login"/> <bean class="interceptor.TestInterceptor"/> </mvc:interceptor>