潍坊建站程序,wordpress上传pdf,wordpress 短信验证,宝安做小程序有推荐吗我们梳理一下 Spring Boot 项目中是如何对 HTTP 请求的响应体 (Response Body) 进行压缩。 #xff08;请注意#xff1a;压缩是针对服务器返回给客户端的响应体#xff0c;而不是客户端发给服务器的请求 URL 或请求体#xff09;。
核心思想#xff1a;减少网络传输的数…我们梳理一下 Spring Boot 项目中是如何对 HTTP 请求的响应体 (Response Body) 进行压缩。 请注意压缩是针对服务器返回给客户端的响应体而不是客户端发给服务器的请求 URL 或请求体。
核心思想减少网络传输的数据量加快客户端加载速度。 结论
Spring Boot 默认开启了对常见文本类型如 JSON, HTML, CSS, JS的响应体压缩Gzip通常我们不需要做任何配置只需要确保
响应体大小超过了默认阈值 (2048 bytes)。响应 Content-Type 是默认支持压缩的类型之一 (如 application/json)。客户端在请求头中声明了 Accept-Encoding: gzip (目前浏览器和工具默认都会加)。 下面是详细的解释和配置方法
1. 压缩工作原理 (协商机制)
压缩过程是由客户端和服务器自动协商完成的对Controller 代码透明
客户端请求 (Request): 浏览器或 HTTP 客户端发送请求时在请求头中携带 Accept-Encoding 字段告知服务器它支持哪些压缩算法。 GET /api/data HTTP/1.1Host: example.comAccept: application/jsonAccept-Encoding: gzip, deflate, br 服务器响应 (Response): Spring Boot及其内嵌容器如 Tomcat检查到 服务器开启了压缩功能。客户端 Accept-Encoding 中包含服务器支持的算法如 gzip。响应的 Content-Type 在配置的 mime-types 列表中。响应体的大小超过了配置的 min-response-size。 如果所有条件满足服务器将使用协商好的算法如 gzip压缩响应体。在响应头中添加 Content-Encoding 字段告知客户端使用了何种算法。响应头中的 Content-Length 变为压缩后的大小。发送压缩后的数据。 HTTP/1.1 200 OKContent-Type: application/jsonContent-Encoding: gzip Content-Length: 850 // - 压缩后的大小 (例如原始大小是 3KB)...[压缩后的二进制数据]客户端接收: 客户端看到 Content-Encoding: gzip 后自动对收到的响应体进行解压再处理原始数据。
2. Spring Boot 配置
你可以在 application.properties 或 application.yml 中进行配置和微调。
使用 application.properties:
# 1. 启用响应压缩 ( ⭐ 默认值: true )
# 如果你确定前端有反向代理如 Nginx在做压缩可以在这里设为 false避免重复压缩。
server.compression.enabledtrue # 2. 配置需要压缩的内容类型 MIME types ( ⭐ 默认值已包含常见类型)
# 只有 Content-Type 匹配这里的列表才会被考虑压缩。
# 默认值包括: text/html, text/xml, text/plain, text/css, text/javascript,
# application/javascript, application/json, application/xml 等等。
# 注意不要添加已经压缩过的类型如 image/jpeg, image/png, application/zip 等重复压缩浪费 CPU 且效果差。
server.compression.mime-typesapplication/json,application/xml,text/html,text/plain,application/javascript,text/css# 3. 触发压缩的最小响应体大小 ( ⭐ 默认值: 2048 bytes即 2KB )
# 如果响应体小于此值即使满足其他条件也不会压缩。
# 因为对小数据进行压缩的 CPU 开销可能大于节省的带宽得不偿失。
# 单位是字节。
server.compression.min-response-size1024 # 例如改为 1KB# (可选) 排除某些 User-Agent
# server.compression.excluded-user-agentssome-bad-client使用 application.yml:
server:compression:enabled: true # 默认 truemime-types: # 默认包含常见类型- application/json- application/xml- text/html- text/plain- application/javascript- text/cssmin-response-size: 1024 # 默认 2048 bytes3. Controller 代码示例
你的 Controller 代码无需做任何修改Spring Boot / 内嵌服务器会自动处理。 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;RestControllerpublic class MyController {// 模拟一个返回较大数据用于测试 GET 请求的响应压缩GetMapping(/api/users)public ListString getUsers() {// 生成一个较大的列表确保 JSON 序列化后大小超过 server.compression.min-response-sizereturn IntStream.range(0, 1000).mapToObj(i - User Name - i with some description text here.).collect(Collectors.toList());}// 模拟一个 POST 请求它的响应体同样会被压缩PostMapping(/api/users/filter)public ListString filterUsers(RequestBody String filter) {// 假设过滤后仍然返回一个大数据return IntStream.range(0, 800).mapToObj(i - Filtered User Name - i for filter filter).collect(Collectors.toList());}}当客户端带上Accept-Encoding: gzip请求 /api/users 或 /api/users/filter 时如果返回的 JSON 大小超过了 min-response-sizeSpring Boot 就会自动返回 Content-Encoding: gzip 的压缩响应。
4. 如何验证
使用浏览器的开发者工具 (F12) - 网络 (Network) 面板
刷新页面或触发 API 请求。找到你的 API 请求记录。点击该请求查看 “标头” (Headers) - “响应标头” (Response Headers)。 如果看到 Content-Encoding: gzip (或 br, deflate)则表示压缩成功。 在请求列表的大小 (Size) 列Chrome 等浏览器会显示两个值 上面的小数字网络传输的压缩后大小。下面的大数字解压后的原始大小。两者有显著差异就说明压缩生效了。
或者使用 curl 命令
# -v 显示详细信息包含头
# --compressed 告诉 curl 自动请求并解压 (它会自动加上 Accept-Encoding: gzip, deflate 并根据 Content-Encoding 解压)
# -o /dev/null 不输出内容到屏幕
curl -v --compressed http://localhost:8080/api/users -o /dev/null在 curl 的输出中查找 Response Headers 是否包含 Content-Encoding: gzip。
5. 注意事项
反向代理 (Reverse Proxy): 在生产环境中Spring Boot 应用前端经常会有 Nginx, Apache 或负载均衡器。这些反向代理通常也具备非常高效的压缩能力。最佳实践通常是在反向代理层如 Nginx统一处理压缩而在 Spring Boot 中关闭压缩 (server.compression.enabledfalse)以避免重复压缩和减轻应用服务器的 CPU 负担。CPU 开销: 压缩会消耗服务器 CPU 资源。不要压缩已压缩内容: 确保 mime-types 里不包含图片 (jpg, png, gif)、视频、zip 包等它们本身就是压缩格式再次压缩基本无效甚至可能增大体积且浪费 CPU。Streaming 响应: 对于流式响应例如 StreamingResponseBody 或 WebFlux 的 Flux压缩机制依然有效但实现方式略有不同边生成边压缩边发送。
总的来说Spring Boot 提供了开箱即用的响应体压缩功能通过简单的 server.compression.* 属性即可配置无需修改业务代码。