1. Spring MVC请求执行顺序全解析
作为一名长期使用Spring框架的后端开发者,我经常遇到团队成员对请求执行顺序的困惑。特别是在处理幂等校验、日志记录、参数验证等场景时,不清楚应该在哪个环节进行操作最合适。今天我就来彻底剖析Spring MVC中一个HTTP请求的完整生命周期。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心执行链路详解
2.1 完整执行顺序
经过多次验证和源码分析,Spring MVC处理请求的标准流程如下:
- Filter阶段:请求最先到达Servlet Filter
- Interceptor.preHandle:进入Spring MVC拦截器前置处理
- @RequestBody解析:消息转换器将JSON转换为Java对象
- AOP前置通知:执行@Before或@Around的前置部分
- Controller方法:实际业务逻辑执行
- AOP后置通知:执行@AfterReturning或@Around的后置部分
- Interceptor.postHandle:拦截器后置处理
- Filter返回:最终响应通过Filter返回
这个顺序非常重要,它决定了你在不同环节能获取到什么数据,以及操作会产生什么影响。
2.2 各环节关键特性
| 环节 | 执行时机 | 可获取的数据 | 线程上下文 | 典型用途 |
|---|---|---|---|---|
| Filter | 请求最先到达 | 原始HttpServletRequest | 完整Servlet环境 | 跨域处理、编码设置 |
| Interceptor.preHandle | 进入Controller前 | 请求头、参数(未解析body) | Spring上下文已加载 | 权限校验、日志记录 |
| @RequestBody解析 | preHandle之后 | 原始请求流(仅一次读取机会) | 消息转换器工作期间 | 自定义反序列化逻辑 |
| AOP前置 | 参数解析完成后 | 已解析的方法参数 | 代理对象上下文 | 参数校验、日志记录 |
| Controller | 业务逻辑执行 | 已注入的方法参数 | 业务执行环境 | 核心业务处理 |
| AOP后置 | 业务方法执行后 | 方法返回值 | 代理对象上下文 | 结果包装、异常转换 |
| Interceptor.postHandle | 视图渲染前 | ModelAndView对象 | Spring MVC上下文 | 响应增强、统一包装 |
| Filter返回 | 最终响应输出 | 完整的HttpServletResponse | Servlet环境 | 响应加密、压缩 |
3. 关键环节深度解析
3.1 Filter的执行机制
Filter是Servlet规范定义的组件,它的执行完全独立于Spring框架。在Spring Boot应用中,Filter的执行顺序由@Order注解或FilterRegistrationBean控制。
典型Filter实现示例:
java复制public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletRes
