簡體   English   中英

spring中一個HTTP請求是如何解碼的?

[英]How is a HTTP request decoded in spring?

所以我的問題是我覺得沒有那么多解決的問題,我的問題很簡單,當服務器接收到 HTTP 消息(請求)時,它是如何解碼或處理的(假設服務器正在運行一個 spring mvc 應用程序)?

把我的問題放在上下文中,假設一個簡單的 HTTP 消息由客戶端發送到服務器,HTTP 消息在哪里解碼? 從某種意義上說,某些邏輯或代碼必須解析 HTTP 請求以查看其中包含的內容,我的問題是此操作在哪里發生? 這是調度程序 servlet 負責的事情嗎? 應用程序容器,即 tomcat 是否負責解析/解碼 HTTP 消息? 如果spring負責,請給出解碼HTTP消息涉及哪些類。

似乎Dispatcher servlet負責解碼 HTTP 請求,特別是HttpServlet 根據這個來源(以及其他一些來源),Dispatcher Servlet 似乎有一堆子層:

在此處輸入圖片說明

顧名思義,HttpServlet 類是以 HTTP 為中心的 Servlet 實現,也是由規范定義的。

在更實際的術語中,HttpServlet 是一個帶有 service() 方法實現的抽象類,該類實現按 HTTP 方法類型拆分請求。

更多關於 DispatcherServlet:

作為 Web 應用程序的開發人員,我們真正想做的是抽象出以下乏味的樣板任務,並專注於有用的業務邏輯:

  • 將 HTTP 請求映射到某種處理方法
  • 將 HTTP 請求數據和標頭解析為數據傳輸對象 (DTO) 或域對象
  • 模型-視圖-控制器交互
  • 從 DTO、域對象等生成響應。

Spring DispatcherServlet 正是提供了這一點。



PS:好問題! 我已經使用 Spring 一段時間了,但從未真正質疑過如此詳細的流程。 謝謝你送我走這條路:)

Spring Web MVC 在 servlet 容器內運行,如Tomcat

即使在使用 Spring Boot 時,您不必將 WAR 文件顯式部署到安裝在您機器上的 Tomcat 實例,也有一個 Tomcat 實例(或另一個 servlet 容器,如 Jetty 或 Undertow - 不完全是 servlet 容器,但履行相同的角色)在您的 Spring Boot 應用程序中嵌入運行。

servlet 容器的作用是實現 JEE(現在的 Jakarta EE)的Servlet 規范 因此,servlet 容器負責偵聽 HTTP 端口(80、8080、443...),解析它收到的 HTTP 請求,並通過 Servlet API 將它們暴露給上層。

同樣,Servlet API 允許向客戶端發送響應。 它將我們傳遞給它的 Java 對象和方法調用轉換為正確的 HTTP 響應並通過網絡發送它。

servlet API 相對較低級別,直接使用它非常冗長乏味。 這就是為什么 MVC 框架,例如 Spring MVC(以及之前的 Struts 和許多其他框架)以及 JSF 都建立在它之上的原因。

(請注意,並非所有 Java Web 框架都構建在 Servlet API 之上。Play! 框架就是這樣的一個示例。)

因此,反過來,Spring MVC 使用 Servlet API 並在其基礎上進行構建,並且大部分將其隱藏起來,以便向您(應用程序程序員)公開其自己的 API,並為您提供更多便利和功能,例如

  • 根據請求的 URL 將請求分派給您的控制器
  • 從請求正文中提取和解析 JSON 並將其作為 Java 對象公開給您
  • 幫助上傳文件
  • 等等...

現在,如果您使用反應式端點( Spring Web 反應式框架),情況會有所不同,並且可能不會直接涉及 Servlet API。 但那是另一個故事了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM