從spring MVC角度理解HTTP協議及Request-Response模式

什么是HTTP協議?HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是一種通信規則,它定義了客戶端(如瀏覽器、手機APP)?和服務器?之間如何交換信息,是用于在萬維網(WWW)中傳輸數據的應用層協議,它定義了客戶端與服務器之間如何通信、如何請求資源如網頁、圖片、視頻,以及如何響應請求,是互聯網信息交互的通用語言。

?一、HTTP協議的核心定位:應用層的通信規則在TCP/IP協議棧(互聯網的基礎通信框架)中,HTTP屬于應用層協議,其底層依賴傳輸層的TCP協議提供可靠的數據傳輸通道。TCP負責把數據安全送到對方,確保數據不丟失、不混亂,HTTP負責定義數據的格式和交互邏輯。?

二、 HTTP的核心特點 :1. 無狀態HTTP協議本身不記錄“前后請求的關聯”——服務器不會記住上一次給這個客戶端發了什么,每次請求都是獨立的、全新的。 例如:你第一次訪問某購物網站,服務器不知道你是誰;第二次點擊“加入購物車”,若沒有Cookie或Token(用于身份標識的技術),服務器依然不認識你。 2. 請求-響應模式(Request-Response)通信必須由客戶端主動發起,服務器只能“被動響應”,不會主動向客戶端發送數據。流程固定為: 客戶端發送請求 → 服務器處理請求 → 服務器返回響應3. 可擴展HTTP允許通過頭部字段擴展功能,比如用Accept-Encoding: gzip告訴服務器我支持壓縮數據。 4. 媒體無關HTTP可傳輸任意類型的數據(只要客戶端和服務器約定好格式,包括網頁、圖片、視頻、JSON數據等。

三、HTTP的核心交互流程:請求與響應 一次完整的HTTP通信,本質是客戶端發請求、服務器回響應的過程,兩者都有固定的格式。

1. HTTP 請求(客戶端→服務器)
請求由 3 部分組成:請求行、請求頭部、請求體(可選)。

請求頭部:輔助信息,如Host(指定服務器域名)、Cookie(攜帶客戶端的身份信息,如登錄狀態)、Content-Type(POST 請求時,說明請求體的數據格式,如application/json)。
請求體:僅 POST/PUT 等請求有,用于傳遞數據(如登錄時的 “用戶名 + 密碼”、上傳的文件內容)。請求行:核心信息,決定 “要做什么”。請求方法:常用有GET(獲取資源,如打開網頁)、POST(提交數據,如登錄、上傳表單)、PUT(修改資源)、DELETE(刪除資源)。

程序如何接收前端網頁的數據?第一種方式:通過GET、POST等請求。

這種方式首先就要在方法上加上注解@RequestMapping并給定路徑("v1/car/add")而要給客戶端反饋還得加上@ResponseBody注解。同時用戶在輸入網址的時候要按照以下格式:localhost:+(本地的port)+路徑+?+給定參數賦值

@Controller
public class CarController {@RequestMapping("v1/car/add")@ResponseBodypublic String add(String brand,String color,int price){System.out.println("品牌是:"+brand+"顏色是"+color+"價格是"+price);return "add";}
}

localhost:8080/v1/car/add?brand=tsl&color=black&price=100000

這種方式屬于后端,需要注意一定要先啟動程序,然后再輸入網址,順序不能反,如果有修改代碼,也一定要重新運行程序。

第二種方式:通過.html文件獲取。

所有的.html文件都屬于靜態資源,所以應該在resources中的static里面創建。完成創建后里面會有個<body>的標簽,在<body>內即可編輯頁面。比如想拿到車輛的brand、color、price等信息并添加,先設置好路徑并告訴它方法是post(post就是添加的作用)然后用<input>標簽就可以讓用戶輸入,并給placeholder提示。在打開網頁的時候一定要確保后端的代碼仍然處于運行狀態。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="http://localhost:8080/v1/car/add" method="post"><input type="text" name="brand" placeholder="請輸入品牌"><input type="text" name="color" placeholder="請輸入顏色"><input type="text" name="price" placeholder="請輸入價格"><input type="submit" value="添加車輛">
</form>
</body>
</html>

這就通過用.html完成了新增車輛的功能,但這屬于前端的處理方式,不再做過多的討論。

這里只有三個參數需要給,但實際中可能會有很多參數,而一旦只要有一個字母打錯了就可能導致整個程序沒法收到客戶端的請求。那么就可以將客戶端提供的數據先保存到一個AddCarDTO類中并定義必要的參數,加上tostring/get/set方法,這個DTO類可以放到一個pojo包里面,那么程序就會根據這個類來得到客戶端輸入的數據。

    @RequestMapping("/v1/car/add2")@ResponseBodypublic String add2(AddCarDTO addCarDTO){System.out.println(addCarDTO);return "add";}

localhost:8080/v1/car/add2

localhost:8080/v1/car/add2?brand=byd&color=white&price=300000

可以看到,分別給了沒值和有值的,就算不輸入必要的信息,它也會給默認值而不會獲取失敗,這樣既能方便用戶輸入,也減少了輸入錯誤的可能。

接下來在當前工程實現一個功能:BMI身體質量指數測試 BMIController。客戶端將用戶的 身高height和 體重weight 傳遞給服務端,服務端接收參數并計算用戶的身體健康指數。計算公式:bmi = 體重kg/(身高m*身高)<18.5 偏瘦 <24 正常 <27 微胖 >=27 該減肥了

先在pojo里面創建一個BmiDTO類,接收網頁數據時就是用這個類,同時加上get/set/tostring方法。然后在Controller中創建BMIController類,用于計算bmi,屬于后端的業務。根據接收的BmiDTO類的對象,獲取其中的高度和重量,完成計算后根據bmi所在的范圍給客戶端反饋。

public class BmiDTO {private double weight;private double height;@Overridepublic String toString() {return "BmiDTO{" +"weight=" + weight +", height=" + height +'}';}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}
}
@Controller
public class BMIController {@RequestMapping("/v1/bmi/func")@ResponseBodypublic String func(BmiDTO bmi){double high=bmi.getHeight();double weight=bmi.getWeight();double res=weight/(high*high);if(res<18.5)return "偏瘦";else if(res<24)return "正常";else if(res<27)return "微胖";elsereturn "該減肥了";}
}

2. HTTP 響應(服務器→客戶端)
響應同樣由 3 部分組成:狀態行、響應頭部、響應體(可選)。
狀態行:核心是狀態碼,用數字表示請求的處理結果(常見狀態碼如下表)。
響應頭部:輔助信息,如Content-Type(標識響應體的類型)、Set-Cookie(服務器向客戶端寫入 Cookie,如登錄后的身份令牌)、Cache-Control(控制資源的緩存策略,如 “緩存 1 小時”)。
響應體:服務器返回的實際數據,如 HTML 網頁、JSON 數據、圖片二進制流等(若狀態碼是 404,響應體可能是 “404 頁面找不到” 的提示內容)。

常見 HTTP 狀態碼分類
狀態碼以 “第一位數字” 區分含義,核心常用碼如下:

??????? 1xx(信息性):臨時響應,告知客戶端 “請求已收到,正在處理”(極少用,如100 Continue)。
??????? 2xx(成功):請求已正常處理,最常用:
??????? 200 OK:通用成功(如網頁加載、API 調用成功);
??????? 201 Created:資源創建成功(如 POST 請求新增用戶、上傳文件成功)。
??????? 3xx(重定向):請求需要進一步操作(客戶端需跳轉):
??????? 301 Moved Permanently:永久重定向(如舊域名跳轉新域名,搜索引擎會更新地址);
??????? 302 Found:臨時重定向(如登錄后跳轉首頁,下次訪問仍走原地址);
??????? 304 Not Modified:緩存命中(客戶端本地有最新緩存,無需重新下載資源)。
??????? 4xx(客戶端錯誤):請求本身有問題,服務器無法處理:
??????? 400 Bad Request:請求參數錯誤(如 JSON 格式錯誤、必填字段缺失);
??????? 401 Unauthorized:未授權(需要登錄或令牌失效);
??????? 403 Forbidden:權限不足(已登錄,但無操作權限,如普通用戶刪管理員數據);
??????? 404 Not Found:資源不存在(如訪問不存在的網頁、API 路徑錯誤)。
??????? 5xx(服務器錯誤):服務器處理請求時出錯(客戶端無錯):
??????? 500 Internal Server Error:通用服務器錯誤(如代碼 bug、數據庫連接失敗);
??????? 502 Bad Gateway:網關錯誤(服務器作為網關時,上游服務器無響應,如反向代理后端掛了);
??????? 503 Service Unavailable:服務暫時不可用(如服務器維護、負載過高);
??????? 504 Gateway Timeout:網關超時(上游服務器響應太慢,網關等不及)。

在瀏覽器中輸入www.360buy.com打開的卻是京東頁面

背后核心是域名重定向機制,對應的 HTTP 狀態碼主要是 3xx 系列重定向狀態碼,最常見的是 301 永久重定向 或 302 臨時重定向,其中京東對該域名的配置更可能是 301 永久重定向。
為什么會跳轉?—— 域名歷史與重定向邏輯
360buy.com 本身是京東早期使用的域名(京東曾用名 “360buy 京東”),后來為了品牌統一,將主域名切換為 jd.com。為了避免老用戶因記憶舊域名無法訪問,京東會通過服務器配置,讓所有訪問 www.360buy.com 的請求自動跳轉到 www.jd.com(或京東主站其他地址),這個過程就是 “HTTP 重定向”。
核心狀態碼:301 和?302 的區別
重定向的核心是通過 HTTP 響應頭中的 Location 字段指定新地址,同時用 3xx 狀態碼 告訴瀏覽器 “該地址已變更,請訪問新地址”。其中京東對 360buy.com 的配置更可能是 301 永久重定向

四、HTTP與HTTPS的核心區別

我們常說的 “HTTP 不安全”,本質是它傳輸數據時不加密,數據在網絡中可能被攔截、篡改(如 “中間人攻擊”)。而 HTTPS(HTTP Secure)是 “HTTP+SSL/TLS 加密協議” 的組合,解決了安全問題:

HTTP 協議(HyperText Transfer Protocol,超文本傳輸協議)和 HTTPS 協議(HyperText Transfer Protocol Secure,超文本傳輸安全協議)是互聯網中用于客戶端(如瀏覽器)與服務器之間數據傳輸的核心協議,二者的核心區別在于安全性,但在傳輸原理、端口、應用場景等維度也存在顯著差異。以下從 7 個關鍵維度進行詳細對比,并補充核心原理說明:

1.安全性:明文 vs 加密(核心區別)
HTTP 的安全隱患:HTTP 傳輸的數據是 “明文”—— 比如在網頁上輸入的賬號密碼、支付信息,會以 “原始文本” 的形式在網絡中傳輸。如果數據被 “中間人”(如黑客通過公共 WiFi 攔截、路由器劫持)捕獲,可直接讀取內容,甚至篡改數據,完全無安全保障。
HTTPS 的安全機制:HTTPS 通過SSL/TLS 協議解決了 HTTP 的安全問題,核心依賴兩種加密技術和證書驗證,混合加密(對稱加密 + 非對稱加密),通過?TLS/SSL 協議對 HTTP 協議的傳輸過程進行加密和認證,從而解決 HTTP 協議原生存在的明文傳輸、身份不可信、數據易篡改三大安全問題。
服務器需安裝權威 CA 機構頒發的證書,證書中包含服務器的公鑰和身份信息。客戶端(瀏覽器)會驗證證書的合法性 —— 若證書無效,瀏覽器會彈出 “不安全” 警告,避免用戶連接到偽裝的釣魚網站。

2. 傳輸流程:簡單 vs 多握手步驟
HTTP 傳輸流程:客戶端通過 TCP 協議與服務器的 80 端口建立連接;客戶端發送 HTTP 請求;服務器返回 HTTP 響應;連接關閉(或保持長連接)。整個過程無額外安全步驟,流程簡單。
HTTPS 傳輸流程:在 HTTP 流程基礎上,增加了SSL/TLS 握手階段(約 3-4 次 TCP 交互):客戶端與服務器的 443 端口建立 TCP 連接;SSL/TLS 握手:客戶端發送 “支持的加密算法列表”“隨機數 A”;服務器返回 “選定的加密算法”“隨機數 B”“服務器 SSL 證書”;客戶端驗證證書合法性,生成 “預主密鑰”,用服務器公鑰加密后發送給服務器;客戶端和服務器分別用 “隨機數 A + 隨機數 B + 預主密鑰” 生成相同的 “對稱加密密鑰”;后續的 HTTP 請求 / 響應,均用 “對稱加密密鑰” 加密后傳輸;連接關閉(或保持長連接)。握手階段是 HTTPS 比 HTTP 慢的主要原因,但現代瀏覽器和服務器會通過會話復用等技術減少重復握手,降低性能損耗。

在網絡通信中優先使用https,它從根本上解決了 HTTP 協議的安全缺陷,能保護數據傳輸的完整性、機密性和身份真實性,同時滿足現代網絡環境對安全、合規和用戶信任的核心需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921379.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

江協科技STM32學習筆記補充之003 :STM32復位電路的詳細分析

電路作用與每個器件R1&#xff08;10 kΩ&#xff0c;上拉到 3V3&#xff09;讓 NRST 在無外力時保持高電平&#xff1d;不復位&#xff1b;同時與電容形成 RC&#xff0c;決定上電復位延時。阻值不能太小&#xff08;否則調試器或芯片復位驅動下拉電流太大&#xff09;&#x…

Spring Boot HTTP狀態碼詳解

Spring Boot HTTP狀態碼完全指南&#xff1a;從入門到精通 前言 在RESTful API開發中&#xff0c;HTTP狀態碼是與客戶端通信的重要橋梁。Spring Boot通過HttpStatus枚舉提供了完整的HTTP狀態碼支持。本文將深入解析這些狀態碼的含義、使用場景以及在Spring Boot中的最佳實踐。 …

怎樣讓外網計算機訪問局域網計算機?通過公網地址訪問不同內網服務的設置方法

局域網服務器提供公網訪問&#xff0c;或指定某些端口應用資源給外地訪問&#xff0c;都是常見跨網通信需求。在一些場景下&#xff0c;內部網絡中的服務器需要通過公網地址進行訪問&#xff0c;尤其是在沒有固定公網IP或需要在外部訪問時。為了解決這一問題&#xff0c;可以使…

Spring Boot啟動失敗從循環依賴到懶加載配置的深度排查指南

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

從零開始學大模型之大語言模型

大語言模型 4.1 什么是 LLM 在前三章&#xff0c;我們從 NLP 的定義與主要任務出發&#xff0c;介紹了引發 NLP 領域重大變革的核心思想——注意力機制與 Transformer 架構。隨著 Transformer 架構的橫空出世&#xff0c;NLP 領域逐步進入預訓練-微調范式&#xff0c;以 Tran…

如何將視頻從 iPhone 轉移到 Mac

將視頻從 iPhone 轉移到 Mac 是許多用戶常見的需求。無論你是想備份重要的視頻&#xff0c;還是希望在更大的屏幕上觀看&#xff0c;以下方法都能幫助你輕松完成。方法一&#xff1a;使用 iReaShare iPhone ManageriReaShare iPhone Manager 是一款功能強大的工具&#xff0c;可…

五、Docker 核心技術:容器數據持久化之數據卷

Docker 容器本身是無狀態且生命周期短暫的。當一個容器被刪除時&#xff0c;它在可寫層產生的所有數據都會隨之消失。這對于需要持久化存儲數據的應用 (如數據庫、日志系統、用戶上傳內容) 來說是不可接受的。為了解決這個問題&#xff0c;Docker 提供了多種數據持久化方案&…

前端視覺交互設計全解析:從懸停高亮到多維交互體系(含代碼 + 圖表)

在前端用戶體驗領域&#xff0c;視覺交互是連接用戶與產品的 “隱形橋梁”—— 它通過可視化信號傳遞操作意圖、反饋系統狀態&#xff0c;直接決定用戶對產品的感知。很多開發者對視覺交互的認知停留在 “鼠標懸停高亮”&#xff0c;但實際上&#xff0c;視覺交互是一個覆蓋 “…

從零打造商業級LLMOps平臺:開源項目LMForge詳解,助力多模型AI Agent開發!

最近&#xff0c;我發現了一個超級實用的開源項目——LMForge-End-to-End-LLMOps-Platform-for-Multi-Model-Agents&#xff08;以下簡稱LMForge&#xff09;。這個項目是一個端到端的LLMOps&#xff08;Large Language Model Operations&#xff09;平臺&#xff0c;專為多模型…

【C++練習】06.輸出100以內的所有素數

目錄輸出100以內的所有素數方法1&#xff1a;基礎判斷法方法2&#xff1a;埃拉托斯特尼篩法&#xff08;效率更高&#xff09;方法3&#xff1a;優化版篩法&#xff08;只考慮奇數&#xff09;方法4&#xff1a;使用STL算法方法5&#xff1a;遞歸實現總結&#xff1a; 輸出100以…

在開發中使用git rebase的場景

rebase介紹 一、背景 遠程倉庫有oh4w-dev和oh4k-dev兩個分支&#xff0c;oh4k-dev是基于oh4w-dev開發到80%的代碼新拉的分支&#xff1b;此后兩條分支同步開發&#xff0c;當oh4k-dev開發完成&#xff0c;oh4w-dev還在開發階段&#xff0c;oh4k-dev需要拉取到oh4w-dev自分出o…

TDengine 時序函數 NOW() 用戶手冊

TDengine NOW() 函數用戶使用手冊 目錄 功能概述函數語法返回值說明技術特性使用場景及示例時間運算操作注意事項常見問題 功能概述 NOW() 函數是 TDengine 中的時間函數&#xff0c;用于獲取客戶端當前系統時間。該函數在時序數據庫中特別有用&#xff0c;可以用于數據插入…

JavaWeb ——事務管理

文章目錄事務管理事務回顧Spring事務管理事務進階事務屬性 - 回滾 rollbackFor事務屬性 - 傳播行為 propagationSpring框架第一大核心: IOC控制反轉&#xff0c; 其第二大核心就是 AOP 面向切面編程 事務管理 事務回顧 Spring事務管理 # spring 事務管理日志 logging:level:org…

【跨國數倉遷移最佳實踐8】MaxCompute Streaming Insert: 大數據數據流寫業務遷移的實踐與突破

本系列文章將圍繞東南亞頭部科技集團的真實遷移歷程展開&#xff0c;逐步拆解 BigQuery 遷移至 MaxCompute 過程中的關鍵挑戰與技術創新。本篇為第八篇&#xff0c;MaxCompute Streaming Insert&#xff1a; 大數據數據流寫業務遷移的實踐與突破。注&#xff1a;客戶背景為東南…

2025-09-05 CSS4——浮動與定位

文章目錄1 顯示&#xff08;Display&#xff09;1.1 visibility:hidden1.2 display:none2 塊和內聯元素2.1 塊元素2.2 內聯元素2.3 改變元素的顯示方式3 浮動&#xff08;Float&#xff09;3.1 float 屬性3.2 clear 屬性4 定位&#xff08;Position&#xff09;4.1 五種定位模式…

43這周打卡——生成手勢圖像 (可控制生成)

目錄 前言 1.導入數據及數據可視化 2.構建模型 3.訓練模型 4.模型分析并生成指定圖像 總結 前言 &#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 1.導入數據及數據可視化 from torchvision import data…

TDengine 時間函數 TIMEDIFF() 用戶手冊

TDengine TIMEDIFF() 函數詳細使用手冊 目錄 功能概述函數語法參數說明返回值說明版本變更說明技術特性使用場景及示例時間單位處理數據類型兼容性注意事項常見問題最佳實踐 功能概述 TIMEDIFF() 函數用于計算兩個時間戳的差值&#xff0c;返回 expr1 - expr2 的結果。結果…

【2025ICCV-持續學習方向】一種用于提示持續學習(Prompt-based Continual Learning, PCL)的新方法

1. 背景與問題 (Background & Problem):?? ?持續學習 (CL):?? 目標是在不遺忘舊任務知識的情況下,讓模型持續學習一系列新任務。主要挑戰是災難性遺忘。 ?基于提示的持續學習 (PCL):?? 利用預訓練視覺Transformer (ViT),凍結其權重,通過微調稱為“提示”(prompt…

2025 年 08 月 GitHub 十大熱門項目排行榜

歡迎來到 2025 年 8 月 GitHub 熱門開源項目排行榜&#xff01;本月榜單集中展示了來自智能體平臺、AI 編程助手、多模態角色系統、本地化部署工具到可視化白板與企業協同平臺的多元創新。從構建 AI 助手中樞的 Archon&#xff0c;到終端 AI 編碼拍檔 Crush&#xff0c;再到虛擬…

LeetCode每日一題,2025-9-4

多數元素 投票法 讓你找到序列中出現超過二分之一的元素&#xff0c;一定要記住這個規則。 記錄兩個值val和cnt&#xff0c;剛開始val為任意數&#xff0c;cnt0。 如果cnt是0&#xff0c;就把當前val num。接下來判斷&#xff0c;ifnum val&#xff0c;則cnt &#xff0c;e…