Java的Filter与Spring的Interceptor的比较
一、技术规范与框架依赖
| 维度 | 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):
<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):
@Bean
public FilterRegistrationBean<EncodingFilter> encodingFilter() {FilterRegistrationBean<EncodingFilter> bean = new FilterRegistrationBean<>();bean.setFilter(new EncodingFilter());bean.addUrlPatterns("/*");return bean;
}
- Interceptor 配置
 • Spring MVC 配置(WebMvcConfigurer):
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic 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使用详解

