一、技术规范与框架依赖
| 维度 |
Filter |
Interceptor |
| 所属规范 |
Servlet 规范(Java EE 标准组件) |
Spring MVC 框架组件(非 Java EE 标准) |
| 框架依赖 |
不依赖 Spring,仅需 Servlet 容器(如 Tomcat) |
依赖 Spring MVC 框架,需 Spring 容器管理 |
| 应用层级 |
Servlet 容器层(处理 HTTP 请求的底层入口) |
Spring MVC 层(位于 DispatcherServlet 处理流程中) |
二、作用范围与拦截能力
| 维度 |
Filter |
Interceptor |
| 拦截范围 |
拦截所有 HTTP 请求(包括静态资源、非 Spring 管理的请求) |
仅拦截 Spring MVC 请求(无法拦截静态资源或非 Spring Controller 的请求) |
| 数据访问 |
仅操作 ServletRequest/ServletResponse |
可访问 HandlerMethod、ModelAndView 等 Spring 上下文对象 |
| 典型场景 |
全局字符编码、跨域处理、安全防护(XSS/SQL 注入) |
业务级权限校验、日志记录、请求参数预处理 |
三、生命周期与执行顺序
| 维度 |
Filter |
Interceptor |
| 生命周期 |
由 Servlet 容器管理,随 Web 应用启动初始化,销毁于应用关闭 |
由 Spring 容器管理,依赖 Spring 上下文生命周期 |
| 执行顺序 |
在 DispatcherServlet 处理前执行,按 web.xml 或 @WebFilter 声明顺序 |
在 DispatcherServlet 处理后执行,按 Spring 注册顺序(可通过 @Order 调整) |
| 方法触发时机 |
init() → doFilter() → destroy() |
preHandle() → postHandle() → afterCompletion() |
四、功能特性与扩展能力
| 维度 |
Filter |
Interceptor |
| 依赖注入 |
默认不支持,需通过 FilterRegistrationBean 或手动获取 Spring Bean |
天然支持 Spring 依赖注入(如 @Autowired) |
| 异常处理 |
抛出异常无法被 Spring 全局异常处理器捕获(需自行处理或重定向) |
可通过 @ControllerAdvice 统一处理异常 |
| 扩展灵活性 |
功能通用性强,适合底层操作(如请求/响应流修改) |
与 Spring 生态深度集成,支持动态配置和业务逻辑扩展 |
五、配置方式与代码示例
- Filter 配置
• 原生 Servlet 配置(web.xml):
xml
复制代码
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.example.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
• Spring Boot 配置(FilterRegistrationBean):
java
复制代码
@Bean
public FilterRegistrationBean<EncodingFilter> encodingFilter() {
FilterRegistrationBean<EncodingFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new EncodingFilter());
bean.addUrlPatterns("/*");
return bean;
}
- Interceptor 配置
• Spring MVC 配置(WebMvcConfigurer):
java
复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/api/**")
.excludePathPatterns("/api/login");
}
}
六、选型建议与最佳实践
| 场景 |
推荐技术 |
理由 |
| 全局请求处理(如字符编码) |
Filter |
拦截所有请求,不依赖 Spring,性能开销低 |
| 业务逻辑拦截(如权限校验) |
Interceptor |
可访问 Spring 上下文,支持细粒度路径控制 |
| 静态资源处理(如图片缓存) |
Filter |
能拦截静态资源,适合缓存控制或防盗链 |
| 响应数据后处理(如日志记录) |
Interceptor |
利用 postHandle 修改响应内容,结合 ModelAndView |
总结
• Filter 核心优势:底层通用性强、拦截范围广、适合与 Servlet API 直接交互的场景。
• Interceptor 核心优势:与 Spring 生态无缝集成、支持精细化业务拦截、可操作 Spring 上下文。
根据需求选择,两者亦可组合使用(如 Filter 处理编码 → Interceptor 处理权限)。
spring中的Interceptor使用说明
java中的Filter使用详解