文章
Http请求到达Tomcat后的处理流程
当一个 HTTP 请求到达 Tomcat 服务器时,它会经过一系列精心设计的组件和步骤进行处理,最终将响应返回给客户端
当一个 HTTP 请求到达 Tomcat 服务器时,它会经过一系列精心设计的组件和步骤进行处理,最终将响应返回给客户端。这个过程可以概括为以下几个主要阶段:
HTTP 请求在 Tomcat 中的处理流程 📜#
- 连接建立与请求接收 (Connector)
- 监听端口:Tomcat 的 Connector 组件负责在特定的端口(默认为 8080)监听传入的 HTTP 请求。常见的 Connector 实现包括 Coyote HTTP/1.1 和 APR (Apache Portable Runtime) Connector。
- 接收连接:当客户端(如浏览器)发起 HTTP 请求时,操作系统会将该网络连接请求交给 Tomcat 的 Connector。Connector 接受连接后,为其分配处理线程。
- 读取请求数据:Connector 负责读取 Socket 中的原始 HTTP 请求字节流(包括请求行、请求头、请求体)并交给后续组件处理。
- 请求解析 (Request Parsing)
- 原始数据读取:Connector 读取的请求数据被传递给内部的 Coyote 请求处理器。
- 构建请求对象:Tomcat 的
CoyoteAdapter将原始数据封装成org.apache.catalina.connector.Request对象,并适配为标准的HttpServletRequest对象。 - 解析过程:
- 请求行:提取 HTTP 方法(如 GET、POST)、URI 和协议版本;
- 请求头:读取所有请求头字段(如
Host、User-Agent、Accept等); - 请求体:若请求包含实体数据(如 POST 表单或 JSON),则读取并缓存在请求体缓冲区中。
- 请求传递与 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、类加载器和资源管理。
- 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()等。
- Wrapper 匹配:Context 使用 Servlet 映射规则(如
- 业务逻辑处理
- Servlet 的
doGet()或doPost()方法中包含了开发者编写的核心业务逻辑,如数据库访问、接口调用、数据处理等。 - 返回的数据可被存入请求作用域中,或直接用于构建响应。
- Servlet 的
- 响应生成 (Response Generation)
- 构建响应对象:Tomcat 创建一个
HttpServletResponse对象,用于构建 HTTP 响应。 - 设置响应状态和头部:Servlet 设置状态码(如 200、404、500)及响应头部字段(如
Content-Type,Set-Cookie)。 - 写入响应体:Servlet 将业务处理结果(HTML、JSON、文件等)写入
HttpServletResponse的输出流中。 - 视图渲染:若使用 MVC 框架,Servlet 会将数据传递给视图层(如 JSP、Thymeleaf)进行页面渲染。
- 构建响应对象:Tomcat 创建一个
- 响应发送
- Filter 链反向处理:在响应发出前,响应数据会再次反向经过 Filter 链,这时可以用于压缩、修改响应头等。
- Connector 发送响应:最终,
HttpServletResponse中的数据被交还给 Connector,由其封装为标准 HTTP 响应报文并通过 Socket 发送给客户端。
- 连接关闭或保持
- Tomcat 根据请求头中的
Connection字段(如keep-alive、close)或协议版本(如 HTTP/1.1, HTTP/2),决定是否保持连接(Connection Reuse)或关闭连接。HTTP/2 支持多路复用,多个请求可复用同一个连接。
- Tomcat 根据请求头中的
HTTP 请求处理流程图 📊#
下面是一个简化的流程图,描述了 HTTP 请求在 Tomcat 中的主要处理步骤: 代码段
Rendering diagram...
✅ 流程图说明:#
- 客户端 (Client):通过浏览器或其他客户端发起 HTTP 请求。
- 网络阶段 (Network):建立 TCP 连接,发送 HTTP 请求,最终接收响应。
- Tomcat 服务器 (Tomcat Server):
- Connector:监听端口、读取原始请求、发送响应数据。
- Servlet Engine:处理 HTTP 协议解析、请求路由、Servlet 调用、Filter 执行、响应构建等核心逻辑。
- 响应阶段:
- 响应经过 Filter 链再返回 Connector。
- Connector 发送响应报文回客户端。
- 根据协议保持或关闭连接。
- 客户端响应处理:
- 浏览器或客户端处理并展示服务器返回的数据。