从浏览器输入 URL 到访问到 Controller 方法:Spring MVC 请求处理全流程解析

54 阅读3分钟

从浏览器输入 URL 到访问到 Controller 方法:Spring MVC 请求处理全流程解析

作者:Web天梯之路
公众号:Web天梯之路

当你在浏览器地址栏输入 http://localhost:8080/order/ORD-12345 并按下回车,直到 Spring 的 @Controller 方法被执行,中间究竟经历了哪些步骤?这不仅是面试高频题,更是理解 Web 应用架构的关键。

今天,我们就以 Spring Boot + Spring MVC 为例,完整梳理 从 URL 输入到 Controller 方法执行的全链路流程


一、整体流程概览

image.png

✅ 本质: “请求 → 路由 → 适配 → 执行 → 响应”

二、详细流程分解

阶段 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 小白变身编程高手!
👉 点赞 + 关注,让更多小伙伴一起进步!