1. 规范来源不同
- 过滤器(Filter):
基于 Servlet 规范(JSR-315),是 Java Web 标准组件,不依赖任何框架(如 Tomcat、Jetty 原生支持)。 - 拦截器(Interceptor):
基于 Spring MVC 框架,是 Spring 生态的扩展功能,需要 Spring 环境支持。
2. 作用范围不同
- 过滤器:
- 全局性:作用于所有请求(包括静态资源、JSP、Servlet)。
- 底层控制:处理 HTTP 请求/响应的原始数据(如修改 Header、Body)。
- 拦截器:
- 针对性:仅作用于 Spring MVC 的控制器(Controller)请求。
- 业务集成:可访问 Spring 上下文(如 Controller 方法、参数、返回值)。
3. 执行时机不同
- 执行顺序:
请求阶段:Filter → DispatcherServlet → Interceptor → Controller
响应阶段:Interceptor → Filter
- 生命周期:
- 过滤器:随 Web 容器(如 Tomcat)启动初始化,服务停止时销毁。
- 拦截器:随 Spring 容器启动初始化,作为 Bean 由 Spring 管理。
4. 功能与使用场景
- 过滤器的典型场景:
- 字符编码转换(
CharacterEncodingFilter
)。 - 跨域处理(CORS)。
- 请求日志记录(如记录 IP、URL)。
- 安全防护(XSS 过滤、敏感词拦截)。
- 字符编码转换(
- 拦截器的典型场景:
- 权限验证(如登录状态检查)。
- 接口耗时统计(在
preHandle
和postHandle
计算时间)。 - 参数预处理(如自动 trim 空格)。
- 统一日志记录业务操作(如记录用户行为)。
5. 控制粒度与灵活性
- 过滤器:
- 粗粒度:处理原始请求/响应,无法直接干预 Controller 方法。
- 依赖 Servlet API:操作
ServletRequest
和ServletResponse
。
- 拦截器:
- 细粒度:可获取 Controller 方法信息(如注解、参数名)。
- 支持 AOP:结合 Spring 的切面能力,实现更灵活的业务拦截。
6. 配置方式不同
- 过滤器:
- 通过
web.xml
或@WebFilter
注解配置。 - 示例:
xml
<filter> <filter-name>logFilter</filter-name> <filter-class>com.example.LogFilter</filter-class> </filter> <filter-mapping> <filter-name>logFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 通过
- 拦截器:
- 通过 Spring 配置类实现
WebMvcConfigurer
并注册拦截器。 - 示例:
java
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/api/**"); } }
- 通过 Spring 配置类实现
回答总结(关键差异)
维度 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
规范 | Servlet 规范,通用性强 | Spring 框架,依赖容器 |
作用范围 | 所有请求(包括静态资源) | 仅 Controller 请求 |
执行顺序 | 更早(在 Servlet 前) | 较晚(在 Controller 前后) |
功能场景 | 数据清洗、全局安全 | 业务逻辑拦截、参数处理 |
灵活性 | 基于 Servlet API,功能较基础 | 深度集成 Spring,支持业务扩展 |
加分回答(适用场景建议)
- 优先使用过滤器:
需要处理所有请求(如静态资源缓存、全局安全过滤)。 - 优先使用拦截器:
需要与业务逻辑紧密集成(如权限校验、参数校验)。 - 组合使用:
例如用过滤器解决跨域,用拦截器记录接口性能,实现分层处理。