有了servlet filter为何spring又新增了interceptor

dalang · · 119 次点击 · · 开始浏览    
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 规范的功能。开发者应根据具体需求合理选择,甚至组合使用两者。
119 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传