拦截器
大约 3 分钟
SpringMVC 拦截器
和Servlet过滤器类似,SpringMVC 提供了拦截器接口实现对请求、响应的拦截和预处理。
拦截器 Springmvc VS 过滤器 Servlet:
- 相似点:
- 拦截:必须先把请求拦住,才能执行后续操作
- 过滤:拦截器或过滤器存在的意义就是对请求进行统一处理
- 放行:对请求执行了必要操作后,放请求过去,让它访问原本想要访问的资源
- 不同点:
工作平台不同
过滤器工作在 Servlet 容器中
拦截器工作在 SpringMVC 的基础上
拦截的范围
过滤器:能够拦截到的最大范围是整个 Web 应用
拦截器:能够拦截到的最大范围是整个 SpringMVC 负责的请求
IOC 容器支持
过滤器:想得到 IOC 容器需要调用专门的工具方法,是间接的
拦截器:它自己就在 IOC 容器中,所以可以直接从 IOC 容器中装配组件,也就是可以直接得到 IOC 容器的支持

- 如果用 SpringMVC 的拦截器能够实现,就不使用过滤器。
优先选择使用拦截器,因为它更符合Spring MVC框架的设计和集成,可以更方便地使用Spring的功能。
拦截器使用
要使用拦截器,需要实现SpringMVC提供的拦截器接口:
编写拦截器接口实现类
public class MyInterceptor implements HandlerInterceptor { // 在处理请求的目标handler方法前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor.preHandle"); // 返回true:放行 // 返回false:不放行 return true; } // 在目标 handler 方法之后,handler报错不执行! @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor.postHandle"); } // 渲染视图之后执行(最后),一定执行! @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor.afterCompletion"); } }
img 在SpingMVC组件配置类中,注册拦截器
@Configuration @ComponentScan //TODO: 进行controller扫描 public class SpringMvcConfig implements WebMvcConfigurer { //添加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { //将拦截器添加到Springmvc环境,默认拦截所有Springmvc分发的请求 registry.addInterceptor(new Process01Interceptor()); //精准匹配,设置拦截器处理指定请求 路径可以设置一个或者多个,为项目下路径即可 //addPathPatterns("/common/request/one") 添加拦截路径 registry.addInterceptor(new Process01Interceptor()) .addPathPatterns("/common/request/one","/common/request/tow"); // 可变长参数 //排除匹配,排除应该在匹配的范围内排除 //excludePathPatterns("/common/request/tow"); 排除路径,排除应该在拦截的范围内 registry.addInterceptor(new Process01Interceptor()) .addPathPatterns("/common/request/one","/common/request/tow") .excludePathPatterns("/common/request/tow"); } }
多个拦截器的次序
SpringMVC 会将所有配置的拦截器放入一个 List 中,List 中注册器的顺序与注册的顺序相同。先注册的就在 List 靠前的位置。
SpringMVC 对多个拦截器的使用是伪堆栈的:
- 对于
preHandle()方法,SpringMVC 正序遍历 List,进行拦截 - 对于
postHandle() afterCompletion()方法,SpringMVC **倒序遍历 ** List
