返回文章列表

文章

Http请求到达Tomcat后的处理流程

当一个 HTTP 请求到达 Tomcat 服务器时,它会经过一系列精心设计的组件和步骤进行处理,最终将响应返回给客户端

当一个 HTTP 请求到达 Tomcat 服务器时,它会经过一系列精心设计的组件和步骤进行处理,最终将响应返回给客户端。这个过程可以概括为以下几个主要阶段:

HTTP 请求在 Tomcat 中的处理流程 📜#

  1. 连接建立与请求接收 (Connector)
    • 监听端口:Tomcat 的 Connector 组件负责在特定的端口(默认为 8080)监听传入的 HTTP 请求。常见的 Connector 实现包括 Coyote HTTP/1.1APR (Apache Portable Runtime) Connector。
    • 接收连接:当客户端(如浏览器)发起 HTTP 请求时,操作系统会将该网络连接请求交给 Tomcat 的 Connector。Connector 接受连接后,为其分配处理线程。
    • 读取请求数据:Connector 负责读取 Socket 中的原始 HTTP 请求字节流(包括请求行、请求头、请求体)并交给后续组件处理。
  2. 请求解析 (Request Parsing)
    • 原始数据读取:Connector 读取的请求数据被传递给内部的 Coyote 请求处理器。
    • 构建请求对象:Tomcat 的 CoyoteAdapter 将原始数据封装成 org.apache.catalina.connector.Request 对象,并适配为标准的 HttpServletRequest 对象。
    • 解析过程
      • 请求行:提取 HTTP 方法(如 GET、POST)、URI 和协议版本;
      • 请求头:读取所有请求头字段(如 HostUser-AgentAccept 等);
      • 请求体:若请求包含实体数据(如 POST 表单或 JSON),则读取并缓存在请求体缓冲区中。
  3. 请求传递与 Web 应用定位 (Engine, Host, Context)
    • Engine:请求被传递至 Tomcat 的 Engine 容器,Tomcat 通常只有一个 Engine,它作为请求处理的入口点。
    • Host:Engine 根据请求的主机名(如 www.example.com)选择对应的虚拟主机 Host。每个 Host 表示一个虚拟域名。
    • Context:Host 再根据 URL 路径(如 /myapp)确定 Web 应用的 Context。Context 代表一个独立的 Web 应用,拥有自己的 web.xml、类加载器和资源管理。
  4. Servlet 匹配与处理 (Wrapper, Servlet)
    • Wrapper 匹配:Context 使用 Servlet 映射规则(如 web.xml 或注解)匹配请求的 URL,找到对应的 Wrapper(Servlet 容器),每个 Wrapper 负责管理一个 Servlet。
    • 过滤器链 (FilterChain):在调用 Servlet 之前,请求会进入由多个 Filter 构成的过滤器链。Filter 可用于认证、日志、压缩、编码设置等,顺序由 web.xml 或注解定义。
    • Servlet 调用:过滤器链执行完毕后,由 Wrapper 调用 Servlet 的 service() 方法,并根据请求方法调用 doGet()doPost() 等。
  5. 业务逻辑处理
    • Servlet 的 doGet()doPost() 方法中包含了开发者编写的核心业务逻辑,如数据库访问、接口调用、数据处理等。
    • 返回的数据可被存入请求作用域中,或直接用于构建响应。
  6. 响应生成 (Response Generation)
    • 构建响应对象:Tomcat 创建一个 HttpServletResponse 对象,用于构建 HTTP 响应。
    • 设置响应状态和头部:Servlet 设置状态码(如 200、404、500)及响应头部字段(如 Content-Type, Set-Cookie)。
    • 写入响应体:Servlet 将业务处理结果(HTML、JSON、文件等)写入 HttpServletResponse 的输出流中。
    • 视图渲染:若使用 MVC 框架,Servlet 会将数据传递给视图层(如 JSP、Thymeleaf)进行页面渲染。
  7. 响应发送
    • Filter 链反向处理:在响应发出前,响应数据会再次反向经过 Filter 链,这时可以用于压缩、修改响应头等。
    • Connector 发送响应:最终,HttpServletResponse 中的数据被交还给 Connector,由其封装为标准 HTTP 响应报文并通过 Socket 发送给客户端。
  8. 连接关闭或保持
    • Tomcat 根据请求头中的 Connection 字段(如 keep-aliveclose)或协议版本(如 HTTP/1.1, HTTP/2),决定是否保持连接(Connection Reuse)或关闭连接。HTTP/2 支持多路复用,多个请求可复用同一个连接。

HTTP 请求处理流程图 📊#

下面是一个简化的流程图,描述了 HTTP 请求在 Tomcat 中的主要处理步骤: 代码段

Rendering diagram...

✅ 流程图说明:#

  1. 客户端 (Client):通过浏览器或其他客户端发起 HTTP 请求。
  2. 网络阶段 (Network):建立 TCP 连接,发送 HTTP 请求,最终接收响应。
  3. Tomcat 服务器 (Tomcat Server)
    • Connector:监听端口、读取原始请求、发送响应数据。
    • Servlet Engine:处理 HTTP 协议解析、请求路由、Servlet 调用、Filter 执行、响应构建等核心逻辑。
  4. 响应阶段
    • 响应经过 Filter 链再返回 Connector。
    • Connector 发送响应报文回客户端。
    • 根据协议保持或关闭连接。
  5. 客户端响应处理
    • 浏览器或客户端处理并展示服务器返回的数据。