文章目录
- 1.什么是拦截器
- 2.拦截器特点
- 3.拦截器作用
- 4.springmvc中开发拦截器步骤
- 5.springboot中使用拦截器
- 6.几个常见但不准确的说法
1.什么是拦截器
拦截器(Interceptor)类似于Servlet中的过滤器,主要用于拦截客户请求并做出相应的处理。与过滤器有如下区别:
1.Filter 通常初始化一次,但其 doFilter() 会针对每个匹配请求执行;HandlerInterceptor 的各个回调方法同样会随着匹配请求重复执行,因此不存在“Filter 只能调用一次、Interceptor 可以调用多次”的区别。
2.Filter 工作在 Servlet 层,作用范围通常更广;HandlerInterceptor 工作在 Spring MVC 的 Handler 执行链中,主要针对 Spring MVC 能够映射到 Handler 的请求。
3.Filter 主要操作 Request、Response 等 Servlet 对象;HandlerInterceptor 更接近 Controller,可以获取当前执行的 Handler 等 Spring MVC 上下文信息。
4.Filter 属于 Servlet 规范,由 Servlet 容器管理;HandlerInterceptor 属于 Spring MVC,通常由 Spring 容器管理。
5.Filter 和 HandlerInterceptor 本身都是基于接口回调工作的。“Filter 基于回调,而 Interceptor 基于反射”这种常见说法并不准确,反射更多涉及 Spring MVC 对 Controller 方法的调用过程。6.过滤器不能获取IOC容器中的各个bean,而拦截器可以,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
第 6 点并不准确,特意保留并标记删除线。Filter 如果交由 Spring 容器管理,同样可以注入并使用 Spring Bean,因此这不是 Filter 与 Interceptor 的本质区别。
2.拦截器特点
- 可以在 Controller 执行前、执行后以及请求完成后分别进行处理。
- 主要作用于 Spring MVC 的 Handler 执行链,而不是 Servlet 容器中的所有请求。
- preHandle() 返回 false 时,可以中断后续 Handler 的执行。
3.拦截器作用
将多个 Controller 中共有的请求处理逻辑放入拦截器,可以减少重复代码。常见场景包括日志记录、请求耗时统计、登录状态检查、公共参数处理等。
4.springmvc中开发拦截器步骤
1.实现 HandlerInterceptor 接口,或者实现 WebRequestInterceptor 接口。
2.在传统 Spring MVC 项目中,可通过 XML 配置注册拦截器。
5.springboot中使用拦截器
Spring Boot 中拦截器的实现方式与 Spring MVC 相同,主要区别是通常使用 Java 配置替代传统 XML 配置。
自定义拦截器:
然后实现WebMvcConfigurer配置器。
早期 Spring MVC 项目经常继承 WebMvcConfigurerAdapter,但该类在 Spring Framework 5.0 后已被废弃。现在通常有以下两种写法:
1.直接实现org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口。(推荐)
2.继承 WebMvcConfigurationSupport。这种方式相当于对 Spring MVC 配置进行更深度的接管,可能影响 Spring Boot 原有的 MVC 自动配置。因此普通项目更推荐实现 WebMvcConfigurer,只有确实需要全面自定义 MVC 配置时才考虑继承 WebMvcConfigurationSupport。
6.几个常见但不准确的说法
网上关于 Filter 与 Interceptor 的对比存在一些流传较广的旧说法,这里简单纠正:
1. “Filter 只能调用一次,而 Interceptor 可以调用多次”——不准确。
Filter 的init()通常只执行一次,但真正处理请求的doFilter()会针对每个匹配请求执行;Interceptor 的回调方法同样会随着请求重复执行。
2. “Interceptor 可以访问 ActionContext、值栈”——不适用于 Spring MVC。Action、ActionContext、ValueStack属于 Struts2 体系。Spring MVC 的HandlerInterceptor对应的是 Handler,可以获取当前 Handler 等 Spring MVC 上下文信息。
3. “Filter 基于函数回调,而 Interceptor 基于反射”——不严谨。
Filter 与 HandlerInterceptor 本身都是基于接口回调工作的。Spring MVC 调用 Controller 方法的过程中可能涉及反射,但不能因此认为 HandlerInterceptor 本身是基于反射实现的。