一、技术规范与框架依赖
维度 |
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 {
@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使用详解
