欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot項(xiàng)目中HTTP請(qǐng)求對(duì)響應(yīng)體進(jìn)行壓縮的方法

 更新時(shí)間:2025年06月13日 08:44:36   作者:冰糖心書(shū)房  
本文我們將梳理一下 Spring Boot 項(xiàng)目中是如何對(duì) HTTP 請(qǐng)求的響應(yīng)體 (Response Body) 進(jìn)行壓縮,請(qǐng)注意:壓縮是針對(duì)服務(wù)器返回給客戶端的響應(yīng)體,而不是客戶端發(fā)給服務(wù)器的請(qǐng)求 URL 或請(qǐng)求體,需要的朋友可以參考下

我們梳理一下 Spring Boot 項(xiàng)目中是如何對(duì) HTTP 請(qǐng)求的響應(yīng)體 (Response Body) 進(jìn)行壓縮。
(請(qǐng)注意:壓縮是針對(duì)服務(wù)器返回給客戶端的響應(yīng)體,而不是客戶端發(fā)給服務(wù)器的請(qǐng)求 URL 或請(qǐng)求體)。

核心思想:減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,加快客戶端加載速度。

結(jié)論:

Spring Boot 默認(rèn)開(kāi)啟了對(duì)常見(jiàn)文本類型(如 JSON, HTML, CSS, JS)的響應(yīng)體壓縮(Gzip),通常我們不需要做任何配置!只需要確保:

  • 響應(yīng)體大小超過(guò)了默認(rèn)閾值 (2048 bytes)。
  • 響應(yīng) Content-Type 是默認(rèn)支持壓縮的類型之一 (如 application/json)。
  • 客戶端在請(qǐng)求頭中聲明了 Accept-Encoding: gzip (目前瀏覽器和工具默認(rèn)都會(huì)加)。

下面是詳細(xì)的解釋和配置方法:

1. 壓縮工作原理 (協(xié)商機(jī)制)

壓縮過(guò)程是由客戶端和服務(wù)器自動(dòng)協(xié)商完成的,對(duì)Controller 代碼透明:

客戶端請(qǐng)求 (Request):
瀏覽器或 HTTP 客戶端發(fā)送請(qǐng)求時(shí),在請(qǐng)求頭中攜帶 Accept-Encoding 字段,告知服務(wù)器它支持哪些壓縮算法。

 GET /api/data HTTP/1.1
 Host: example.com
 Accept: application/json
 Accept-Encoding: gzip, deflate, br 

服務(wù)器響應(yīng) (Response):
Spring Boot(及其內(nèi)嵌容器如 Tomcat)檢查到:

  • 服務(wù)器開(kāi)啟了壓縮功能。
  • 客戶端 Accept-Encoding 中包含服務(wù)器支持的算法(如 gzip)。
  • 響應(yīng)的 Content-Type 在配置的 mime-types 列表中。
  • 響應(yīng)體的大小超過(guò)了配置的 min-response-size。
    如果所有條件滿足,服務(wù)器將:
  • 使用協(xié)商好的算法(如 gzip)壓縮響應(yīng)體。
  • 在響應(yīng)頭中添加 Content-Encoding 字段,告知客戶端使用了何種算法。
  • 響應(yīng)頭中的 Content-Length 變?yōu)閴嚎s后的大小。
  • 發(fā)送壓縮后的數(shù)據(jù)。
 HTTP/1.1 200 OK
 Content-Type: application/json
 Content-Encoding: gzip 
 Content-Length: 850  // <- 壓縮后的大小 (例如原始大小是 3KB)
 ...
 [壓縮后的二進(jìn)制數(shù)據(jù)]

客戶端接收:
客戶端看到 Content-Encoding: gzip 后,自動(dòng)對(duì)收到的響應(yīng)體進(jìn)行解壓,再處理原始數(shù)據(jù)。

2. Spring Boot 配置

你可以在 application.properties 或 application.yml 中進(jìn)行配置和微調(diào)。

使用 application.properties:

# 1. 啟用響應(yīng)壓縮 ( ? 默認(rèn)值: true )
#    如果你確定前端有反向代理(如 Nginx)在做壓縮,可以在這里設(shè)為 false,避免重復(fù)壓縮。
server.compression.enabled=true 

# 2. 配置需要壓縮的內(nèi)容類型 MIME types ( ? 默認(rèn)值已包含常見(jiàn)類型)
#    只有 Content-Type 匹配這里的列表,才會(huì)被考慮壓縮。
#    默認(rèn)值包括: text/html, text/xml, text/plain, text/css, text/javascript, 
#               application/javascript, application/json, application/xml 等等。
#    注意:不要添加已經(jīng)壓縮過(guò)的類型,如 image/jpeg, image/png, application/zip 等,重復(fù)壓縮浪費(fèi) CPU 且效果差。
server.compression.mime-types=application/json,application/xml,text/html,text/plain,application/javascript,text/css

# 3. 觸發(fā)壓縮的最小響應(yīng)體大小 ( ? 默認(rèn)值: 2048 bytes,即 2KB )
#    如果響應(yīng)體小于此值,即使?jié)M足其他條件也不會(huì)壓縮。
#    因?yàn)閷?duì)小數(shù)據(jù)進(jìn)行壓縮的 CPU 開(kāi)銷可能大于節(jié)省的帶寬,得不償失。
#    單位是字節(jié)。
server.compression.min-response-size=1024 # 例如,改為 1KB

# (可選) 排除某些 User-Agent
# server.compression.excluded-user-agents=some-bad-client

使用 application.yml:

server:
 compression:
   enabled: true # 默認(rèn) true
   mime-types: # 默認(rèn)包含常見(jiàn)類型
     - application/json
     - application/xml
     - text/html
     - text/plain
     - application/javascript
     - text/css
   min-response-size: 1024 # 默認(rèn) 2048 bytes

3. Controller 代碼示例

你的 Controller 代碼無(wú)需做任何修改!Spring Boot / 內(nèi)嵌服務(wù)器會(huì)自動(dòng)處理。

 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;

 @RestController
 public class MyController {

     // 模擬一個(gè)返回較大數(shù)據(jù),用于測(cè)試 GET 請(qǐng)求的響應(yīng)壓縮
     @GetMapping("/api/users")
     public List<String> getUsers() {
        // 生成一個(gè)較大的列表,確保 JSON 序列化后大小超過(guò) server.compression.min-response-size
         return IntStream.range(0, 1000)
                 .mapToObj(i -> "User Name - " + i + " with some description text here.")
                 .collect(Collectors.toList());
     }
     
      // 模擬一個(gè) POST 請(qǐng)求,它的響應(yīng)體同樣會(huì)被壓縮
      @PostMapping("/api/users/filter")
     public List<String> filterUsers(@RequestBody String filter) {
          // 假設(shè)過(guò)濾后仍然返回一個(gè)大數(shù)據(jù)
          return IntStream.range(0, 800)
                 .mapToObj(i -> "Filtered User Name - " + i + " for filter " + filter)
                 .collect(Collectors.toList());
     }
 }

當(dāng)客戶端(帶上Accept-Encoding: gzip)請(qǐng)求 /api/users 或 /api/users/filter 時(shí),如果返回的 JSON 大小超過(guò)了 min-response-size,Spring Boot 就會(huì)自動(dòng)返回 Content-Encoding: gzip 的壓縮響應(yīng)。

4. 如何驗(yàn)證?

使用瀏覽器的開(kāi)發(fā)者工具 (F12) -> 網(wǎng)絡(luò) (Network) 面板:

  1. 刷新頁(yè)面或觸發(fā) API 請(qǐng)求。
  2. 找到你的 API 請(qǐng)求記錄。
  3. 點(diǎn)擊該請(qǐng)求,查看 “標(biāo)頭” (Headers) -> “響應(yīng)標(biāo)頭” (Response Headers)。
    • 如果看到 Content-Encoding: gzip (或 brdeflate),則表示壓縮成功。
  4. 在請(qǐng)求列表的大小 (Size) 列,Chrome 等瀏覽器會(huì)顯示兩個(gè)值:
    • 上面的小數(shù)字:網(wǎng)絡(luò)傳輸?shù)?strong>壓縮后大小。
    • 下面的大數(shù)字:解壓后的原始大小。
    • 兩者有顯著差異就說(shuō)明壓縮生效了。

或者使用 curl 命令:

# -v 顯示詳細(xì)信息(包含頭)
# --compressed 告訴 curl 自動(dòng)請(qǐng)求并解壓 (它會(huì)自動(dòng)加上 Accept-Encoding: gzip, deflate 并根據(jù) Content-Encoding 解壓)
# -o /dev/null 不輸出內(nèi)容到屏幕
curl -v --compressed http://localhost:8080/api/users -o /dev/null

在 curl 的輸出中查找 Response Headers 是否包含 Content-Encoding: gzip。

5. 注意事項(xiàng)

  • 反向代理 (Reverse Proxy): 在生產(chǎn)環(huán)境中,Spring Boot 應(yīng)用前端經(jīng)常會(huì)有 Nginx, Apache 或負(fù)載均衡器。這些反向代理通常也具備非常高效的壓縮能力。最佳實(shí)踐通常是在反向代理層(如 Nginx)統(tǒng)一處理壓縮,而在 Spring Boot 中關(guān)閉壓縮 (server.compression.enabled=false),以避免重復(fù)壓縮和減輕應(yīng)用服務(wù)器的 CPU 負(fù)擔(dān)。
  • CPU 開(kāi)銷: 壓縮會(huì)消耗服務(wù)器 CPU 資源。
  • 不要壓縮已壓縮內(nèi)容: 確保 mime-types 里不包含圖片 (jpg, png, gif)、視頻、zip 包等,它們本身就是壓縮格式,再次壓縮基本無(wú)效甚至可能增大體積,且浪費(fèi) CPU。
  • Streaming 響應(yīng): 對(duì)于流式響應(yīng)(例如 StreamingResponseBody 或 WebFlux 的 Flux),壓縮機(jī)制依然有效,但實(shí)現(xiàn)方式略有不同(邊生成邊壓縮邊發(fā)送)。

總的來(lái)說(shuō),Spring Boot 提供了開(kāi)箱即用的響應(yīng)體壓縮功能,通過(guò)簡(jiǎn)單的 server.compression.* 屬性即可配置,無(wú)需修改業(yè)務(wù)代碼。

以上就是SpringBoot項(xiàng)目中HTTP請(qǐng)求對(duì)響應(yīng)體進(jìn)行壓縮的方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot HTTP響應(yīng)體壓縮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java動(dòng)態(tài)字節(jié)碼注入技術(shù)的實(shí)現(xiàn)

    Java動(dòng)態(tài)字節(jié)碼注入技術(shù)的實(shí)現(xiàn)

    Java動(dòng)態(tài)字節(jié)碼注入技術(shù)是一種在運(yùn)行時(shí)修改Java字節(jié)碼的技術(shù),本文主要介紹了Java動(dòng)態(tài)字節(jié)碼注入技術(shù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Java虛擬機(jī)堆內(nèi)存溢出的原因和解決方法

    Java虛擬機(jī)堆內(nèi)存溢出的原因和解決方法

    在Java開(kāi)發(fā)中,內(nèi)存溢出(OutOfMemoryError)是一個(gè)常見(jiàn)的問(wèn)題,尤其是在處理大量數(shù)據(jù)或長(zhǎng)時(shí)間運(yùn)行的應(yīng)用時(shí),本文將通過(guò)一個(gè)簡(jiǎn)單的示例,展示如何通過(guò)JVM參數(shù)和代碼分析來(lái)理解和解決內(nèi)存溢出問(wèn)題,需要的朋友可以參考下
    2024-10-10
  • 玩轉(zhuǎn)spring boot 結(jié)合jQuery和AngularJs(3)

    玩轉(zhuǎn)spring boot 結(jié)合jQuery和AngularJs(3)

    玩轉(zhuǎn)spring boot,這篇文章主要介紹了結(jié)合jQuery和AngularJs,玩轉(zhuǎn)spring boot,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • SpringBoot注解@CrossOrigin使用詳解

    SpringBoot注解@CrossOrigin使用詳解

    這篇文章主要介紹了SpringBoot注解@CrossOrigin使用詳解,@CrossOrigin是用來(lái)處理跨域請(qǐng)求的注解
    跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript施加的安全限制,需要的朋友可以參考下
    2023-12-12
  • 詳細(xì)總結(jié)Java for循環(huán)的那些坑

    詳細(xì)總結(jié)Java for循環(huán)的那些坑

    在平常寫(xiě)代碼的過(guò)程中循環(huán)是不可避免的,雖然for的語(yǔ)法并不復(fù)雜,但是在開(kāi)發(fā)中還是會(huì)遇到一些坑,雖然大部分的坑都是自己的騷操作導(dǎo)致的.今天來(lái)總結(jié)一下for循環(huán)在開(kāi)發(fā)中可能遇到的坑,不要在同樣的問(wèn)題上再次犯錯(cuò).需要的朋友可以參考下
    2021-05-05
  • mybatis if傳入字符串?dāng)?shù)字踩坑記錄及解決

    mybatis if傳入字符串?dāng)?shù)字踩坑記錄及解決

    這篇文章主要介紹了mybatis if傳入字符串?dāng)?shù)字踩坑記錄及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器

    SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器

    本篇文章主要介紹了SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器 ,詳細(xì)的介紹了自定義類型轉(zhuǎn)換器的用法和好處,有興趣的可以了解一下。
    2017-04-04
  • springboot掃描引入jar包的service等組件方式

    springboot掃描引入jar包的service等組件方式

    這篇文章主要介紹了springboot掃描引入jar包的service等組件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java實(shí)現(xiàn)寵物商店管理系統(tǒng)

    Java實(shí)現(xiàn)寵物商店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)寵物商店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • SpringBoot定時(shí)任務(wù)參數(shù)運(yùn)行代碼實(shí)例解析

    SpringBoot定時(shí)任務(wù)參數(shù)運(yùn)行代碼實(shí)例解析

    這篇文章主要介紹了SpringBoot定時(shí)任務(wù)運(yùn)行代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論