1. 从Servlet到SpringBoot:请求处理的演进脉络
在Java Web开发的历史长河中,请求处理机制经历了多次迭代演进。早期的Servlet规范中,Filter作为唯一的请求预处理机制存在,它像是守门人,对所有进入容器的请求进行第一道安检。随着Spring框架的兴起,Interceptor作为一种更灵活的拦截机制被引入,它工作在Spring的上下文环境中,能够感知Spring管理的Bean。
SpringBoot的自动配置机制进一步简化了这两种组件的使用。通过查看WebMvcAutoConfiguration源码可以发现,SpringBoot会自动注册HandlerInterceptor和Filter到Servlet容器中。这种自动装配的特性使得开发者可以更专注于业务逻辑的实现,而不必关心底层组件的注册细节。
关键区别:Filter是Servlet规范定义的,Interceptor是Spring框架定义的。这意味着即使不使用Spring框架,Filter依然可以工作,而Interceptor必须运行在Spring上下文中。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 执行时机与作用范围的深度对比
2.1 请求处理流程的全景分析
一个典型的HTTP请求在SpringBoot应用中的处理流程如下:
-
Filter阶段:
doFilter()开始- 字符编码设置
- 跨域请求处理
- 请求体缓存(用于多次读取)
-
DispatcherServlet分发:
- 确定HandlerMapping
- 解析请求参数
-
Interceptor阶段:
preHandle()执行- 权限校验
- 日志记录
- 参数预处理
-
Controller处理:
- 业务逻辑执行
- 返回结果封装
-
Interceptor后处理:
postHandle()执行- 响应数据加工
- 性能监控
-
Filter收尾:
doFilter()结束- 响应头设置
- 响应体压缩
2.2 核心差异对照表
| 特性 | Filter | Interceptor |
|---|---|---|
| 规范层级 | Servlet规范 | Spring框架 |
| 执行时机 | 进入Servlet前/离开Servlet后 | Controller方法前后 |
| 依赖关系 | 不依赖Spring容器 | 需要Spring上下文 |
| 异常处理 | 无法获取 |
