从浏览器输入 URL 到访问到 Controller 方法:Spring MVC 请求处理全流程解析
作者:Web天梯之路
公众号:Web天梯之路
当你在浏览器地址栏输入 http://localhost:8080/order/ORD-12345 并按下回车,直到 Spring 的 @Controller 方法被执行,中间究竟经历了哪些步骤?这不仅是面试高频题,更是理解 Web 应用架构的关键。
今天,我们就以 Spring Boot + Spring MVC 为例,完整梳理 从 URL 输入到 Controller 方法执行的全链路流程!
一、整体流程概览
✅ 本质: “请求 → 路由 → 适配 → 执行 → 响应”
二、详细流程分解
阶段 1️⃣:浏览器发起 HTTP 请求
-
用户输入 URL,浏览器解析域名(DNS 查询)、建立 TCP 连接(三次握手)、发送 HTTP GET/POST 请求。
-
请求示例:
GET /order/ORD-12345 HTTP/1.1 Host: localhost:8080 Accept: application/json
阶段 2️⃣:内嵌 Web 容器接收请求(如 Tomcat)
- Spring Boot 默认内嵌 Tomcat(也可换为 Jetty、Undertow)。
- Tomcat 监听 8080 端口,接收到请求后,将其封装为
HttpServletRequest和HttpServletResponse对象。 - 请求被交给
DispatcherServlet(Spring MVC 的核心入口)。
💡
DispatcherServlet是所有 Spring MVC 请求的统一入口,由web.xml或自动配置注册。
阶段 3️⃣:DispatcherServlet 分发请求
DispatcherServlet 执行以下关键步骤:
3.1 获取所有 HandlerMapping
-
Spring 启动时会注册多个
HandlerMapping,例如:RequestMappingHandlerMapping(处理@RequestMapping)BeanNameUrlHandlerMapping
-
它会遍历这些
HandlerMapping,寻找能处理当前 URL 的处理器(Handler)。
3.2 匹配 Controller 方法
-
以
@RequestMapping("/order/{id}")为例:@RestController public class OrderController { @GetMapping("/order/{id}") public String getOrder(@PathVariable String id) { return "Order: " + id; } } -
RequestMappingHandlerMapping通过路径/order/ORD-12345匹配到getOrder方法,并返回一个 HandlerExecutionChain(包含目标方法 + 拦截器)。
阶段 4️⃣:HandlerAdapter 调用目标方法
-
DispatcherServlet根据 Handler 类型选择合适的HandlerAdapter。 -
对于注解式 Controller,使用
RequestMappingHandlerAdapter。 -
该 Adapter 负责:
-
参数解析:将 URL 参数、Path 变量、JSON Body 等转换为方法参数(通过
HandlerMethodArgumentResolver)。- 如
@PathVariable("id")→"ORD-12345" - 如
@RequestBody OrderDTO← JSON 自动反序列化
- 如
-
调用目标方法:通过反射执行
OrderController.getOrder("ORD-12345")
-
✅ 此阶段还会触发:
@ModelAttribute- 数据绑定(Data Binding)
- 数据校验(
@Valid)
阶段 5️⃣:Controller 方法执行
-
你的业务逻辑正式运行!
-
此时可注入 Service、调用数据库、处理业务等。
-
方法返回值可能是:
String(视图名)ResponseEntity<?>Object(自动转 JSON,因@RestController)
阶段 6️⃣:处理返回值 & 渲染响应
-
HandlerMethodReturnValueHandler根据返回值类型决定如何处理:- 若是对象 +
@RestController→ 使用HttpMessageConverter(如 Jackson)转为 JSON。 - 设置
Content-Type: application/json - 写入
HttpServletResponse的输出流。
- 若是对象 +
阶段 7️⃣:响应返回浏览器
- Web 容器(Tomcat)将响应数据通过已建立的 TCP 连接返回给浏览器。
- 浏览器解析响应(如 JSON、HTML),完成一次完整交互。
三、关键组件速查表
| 组件 | 作用 |
|---|---|
| DispatcherServlet | 前端控制器,协调整个流程 |
| HandlerMapping | 根据 URL 找到对应的 Controller 方法 |
| HandlerAdapter | 调用 Controller 方法,处理参数和返回值 |
| HandlerMethodArgumentResolver | 解析方法参数(如 @PathVariable, @RequestBody) |
| HttpMessageConverter | 对象 ↔ JSON/XML 转换(如 Jackson) |
| ViewResolver | (传统 MVC)解析视图名 → JSP/Thymeleaf 页面 |
四、常见误区提醒
❌ 误区 1:AOP 在 Controller 层一定生效?
- 如果 Controller 方法被同类其他方法调用(自调用),AOP 不生效(原因同
@Transactional自调用问题)。 - 因为代理只对外部调用生效。
❌ 误区 2:所有请求都经过 DispatcherServlet?
- 静态资源(如
/static/**)默认由ResourceHttpRequestHandler处理,不经过 Controller,但仍在 DispatcherServlet 流程中。
✅ 最佳实践:
- 使用
@RestController+ JSON 接口,避免视图层复杂性。 - 异常统一处理:
@ControllerAdvice+@ExceptionHandler。 - 日志/权限/限流等横切关注点,用 Spring AOP 或 拦截器(Interceptor) 实现。
五、总结
从 URL 到 Controller,不是“魔法”,而是一套高度模块化、可扩展的请求处理管道。
📌 关注我,每天5分钟,带你从 Java 小白变身编程高手!
👉 点赞 + 关注,让更多小伙伴一起进步!