Servlet 的 Filter 和 Spring 的 Interceptor 虽然都用于请求拦截,但两者的设计目标、适用场景和功能特性有本质区别。Spring 引入 Interceptor 并非重复造轮子,而是为了弥补 Filter 在业务开发中的局限性。
---
### **一、设计目标的差异**
1. **Filter(过滤器)**
• **定位**:属于 Java Servlet 规范,是 Web 容器(如 Tomcat)级别的组件。
• **核心任务**:处理与 Servlet 容器相关的底层操作,如请求编码转换、全局安全过滤(XSS/SQL 注入防御)、GZIP 压缩等。
• **局限性**:无法直接访问 Spring 容器中的 Bean,对业务逻辑的细粒度控制能力较弱。
2. **Interceptor(拦截器)**
• **定位**:属于 Spring MVC 框架,是业务逻辑层面的拦截工具。
• **核心任务**:增强 Controller 层的业务处理,如权限校验、日志监控、参数预处理等。
• **优势**:深度集成 Spring 生态,支持依赖注入(如直接注入 Service 层 Bean),可基于 AOP 实现更灵活的拦截。
---
### **二、核心功能对比**
| **特性** | Filter | Interceptor |
|-----------------------|---------------------------------|--------------------------------------|
| **作用范围** | 全局(所有请求,包括静态资源) | Controller 层(仅拦截 Spring 管理的请求) |
| **执行顺序** | 在 Servlet 处理前/后执行 | 在 `DispatcherServlet` 之后、Controller 方法前后执行 |
| **依赖注入支持** | 不支持(需通过 `WebApplicationContext` 间接获取 Bean) | 支持直接注入 Spring Bean |
| **可扩展性** | 基于 Servlet 规范,扩展性有限 | 基于 Spring AOP,支持动态代理和自定义切面 |
| **适用场景** | 全局请求处理(如安全过滤、日志记录) | 业务逻辑增强(如权限验证、性能监控) |
---
### **三、为什么需要 Interceptor?**
1. **业务逻辑的细粒度控制**
Filter 无法感知 Spring 的 Controller 方法信息(如参数、注解),而 Interceptor 可直接拦截具体 Controller 方法,甚至获取 `@RequestMapping` 注解信息,实现更精准的业务拦截。
2. **与 Spring 生态的无缝整合**
Interceptor 天然支持 Spring 的事务管理、AOP 切面等功能。例如,在权限校验中可直接调用 `@Service` 注解的业务类,而 Filter 需通过复杂方式获取 Bean。
3. **灵活的生命周期管理**
Interceptor 支持分阶段拦截(`preHandle`、`postHandle`、`afterCompletion`),适用于事务提交前/后的日志记录或资源清理。而 Filter 仅通过 `doFilter` 单一方法处理请求和响应。
4. **解决 Filter 的侵入性问题**
Filter 的配置依赖 `web.xml` 或 Servlet 容器特性,而 Interceptor 通过 Spring 配置(如 `WebMvcConfigurer`),与代码解耦,更符合 Spring Boot 的“约定优于配置”理念。
---
### **四、实际场景中的分工建议**
1. **优先使用 Filter 的场景**
• 跨域处理(CORS)
• 请求/响应编码统一(如 UTF-8)
• 全局安全过滤(如 XSS 防御)。
2. **优先使用 Interceptor 的场景**
• 用户登录状态校验
• API 接口权限控制(基于角色或注解)
• 接口耗时统计与性能监控。
3. **组合使用案例**
例如,先用 Filter 过滤非法字符,再通过 Interceptor 校验用户权限,最后用 AOP 记录方法执行日志,形成多层次拦截体系。
---
### **五、性能与设计哲学**
• **性能对比**:
Filter 由 Servlet 容器直接调用,执行效率更高;Interceptor 经过 Spring 框架调度,略有性能损耗,但通常可忽略。
• **设计哲学**:
Filter 是“防御性工具”,确保进入 Servlet 的请求安全可靠;Interceptor 是“业务增强工具”,聚焦于逻辑扩展。
---
### **总结**
Filter 和 Interceptor 是互补而非替代关系。**Filter 负责底层安全与通用处理,Interceptor 专注业务逻辑增强**。Spring 设计 Interceptor 的目的是为了在自身生态内提供更灵活、更解耦的拦截方案,而非重复 Servlet 规范的功能。开发者应根据具体需求合理选择,甚至组合使用两者。
上一篇:MyBatis缓存机制
下一篇:tomcat的nio1和nio2
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传