首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Tomcat 請求處理全流程源碼解析:從 Socket 到 Servlet

     編輯:Java 綜合教學

Tomcat 請求處理全流程源碼解析:從 Socket 到 Servlet

Tomcat 啟動完成後,如何將外部 HTTP 請求路由到我們編寫的 Servlet?本文基於源碼梳理完整調用鏈:Http11ConnectionHandler → Http11Processor → CoyoteAdapter → 容器層級聯調用 → StandardWrapperValve → 目標 Servlet。

核心組件調用鏈

  1. Http11ConnectionHandler:接收 Socket,啟動 SocketProcessor 線程,複用/創建 Http11Processor
  2. Http11Processor:解析 HTTP 請求頭/行,調用 CoyoteAdapter.service
  3. CoyoteAdapter:Connector 到 Container 的適配器,轉換 Request/Response 類型,啟動容器管道
  4. StandardEngineValve → StandardHostValve → StandardContextValve → StandardWrapperValve:容器層級聯 Valve 調用
  5. StandardWrapperValve:獲取 Servlet 實例,構建 Filter 鏈,最終調用 servlet.service()

關鍵節點詳細解析

1. Http11ConnectionHandler.process()

  • 從 connections 獲取 Processor,無則從 RecycledProcessors(ConcurrentLinkedQueue)取
  • 仍無則創建新 Http11Processor(請求結束後回收到隊列)
  • 調用 Http11Processor.process()

2. Http11Processor.process()

  • 獲取 Socket 輸入/輸出流
  • 解析 Request Header、Method、RequestURI
  • 設置 Request Filters、Content-Length 等
  • 調用 CoyoteAdapter.service()

3. CoyoteAdapter.service() 核心職責

  • 獲取/創建 org.apache.catalina.connector.Request/Response(經 Facade 模式包裝為 Servlet API 類型)
  • postParseRequest:添加 Wrapper-Servlet 映射、解析 SessionId
  • 調用 connector.getService().getContainer().getPipeline().getFirst().invoke() 進入容器管道
  • 請求結束:request.finishRequest()(回收 Processor)、response.finishResponse()(輸出響應)、recycle() 清理對象

4. 容器層級聯 Valve 調用

StandardEngineValve.invoke() 
    → host.getPipeline().getFirst().invoke()  // StandardHostValve
StandardHostValve.invoke()
    → context.getPipeline().getFirst().invoke()  // StandardContextValve (經 NonLoginAuthenticator)
StandardContextValve.invoke()
    → wrapper.getPipeline().getFirst().invoke()  // StandardWrapperValve

5. StandardWrapperValve.invoke() 核心邏輯

  • 從 Wrapper 獲取/創建 Servlet 實例(單例模式,多線程共享)
  • ApplicationFilterFactory 創建 Filter 鏈(含默認 WsFilter)
  • filterChain.doFilter() → 依次執行 Filter → 最後調用 servlet.service()
  • 釋放 Filter 鏈、歸還 Servlet 實例到實例池

請求處理時序圖

Tomcat 請求處理時序圖

總結與省略細節

本文梳理了主流程,省略了以下細節:

  • 三種 Request 類型轉換:Coyote Request → Connector Request → RequestFacade
  • Session 管理機制
  • 長連接維護、異步 Servlet 支持
  • 錯誤處理、Valve 鏈異常傳播

理解該流程有助於排查請求不到達 Servlet、Filter 執行順序錯誤、線程池耗盡等疑難問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved