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