| 对比维度 | Filter (过滤器) | Interceptor (拦截器) |
|---|---|---|
| 本质层面 | 基于 Java Servlet 规范,由 Servlet 容器(如 Tomcat)管理 | 基于 Spring MVC 框架,由 Spring 容器管理 |
| 触发时机 | 在 DispatcherServlet 之前和之后 | 在 DispatcherServlet 内部,Controller 方法调用前后 |
| 依赖关系 | 与 Spring 框架无直接依赖,是 J2EE 标准 | 强依赖于 Spring MVC 框架 |
| 能力范围 | 能处理所有 HTTP 请求(包括静态资源、其他 Servlet) | 只能处理经过 DispatcherServlet 的请求 |
| 上下文感知 | 无法直接感知将要执行的 Controller 方法和 Spring 上下文 | 能获取到即将执行的 HandlerMethod、ModelAndView 等 Spring MVC 核心对象 |
| 异常处理 | 能捕获到 Servlet 容器层面的底层异常 | 只能处理 Spring MVC 流程内的异常,有 @ControllerAdvice 更专业的处理机制 |
| 一句话总结 | 应用的“门卫”,负责技术性、全局性的通用任务。 | 业务的“切面”,负责业务性、精细化的通用任务。 |
| 最佳应用场景 | 1. 全局编码设置 (CharacterEncodingFilter) 2. 跨域CORS处理 (CorsFilter) 3. 安全认证/授权 (如 Spring Security 的 Filter Chain) 4. 全局日志记录 (记录所有进出的 HTTP 流量) 5. 请求数据压缩 (GZIP Filter) 6. 注入全链路追踪ID (TraceID) | 1. 业务层面的权限校验 (检查用户是否有权限调用某个 Controller 方法) 2. 业务审计日志 (记录“谁在什么时间做了什么具体操作”) 3. 防止重复提交 (通过 Token 或 Session 检查) 4. 向视图模型添加通用数据 (如在每个页面底部显示备案号) 5. 精细化的性能监控 (记录特定 Controller 方法的执行耗时) |
- 用 Filter 完成那些与你具体业务逻辑无关,但对整个 Web 应用至关重要的技术基础工作。
- 用 Interceptor 完成那些需要深入了解你的业务上下文(具体是哪个 Controller、哪个方法),并为多个业务场景提供统一横切关注点的业务增强工作。