spring boot 默认不压缩 rest 响应,启用 gzip 压缩需配置 server.compression.enabled=true 等参数;注意 content-length 缺失可能导致压缩失效,可通过过滤器或字符串返回解决;手动压缩适用于特殊场景,客户端需支持 accept-encoding。

Spring Boot 的 REST 接口默认不压缩响应数据,但只需简单配置就能启用 GZIP 压缩,显著减少传输体积,尤其对 JSON、XML 等文本类响应效果明显。Deflate 也可用,但兼容性不如 GZIP,浏览器和服务端支持更广的仍是 GZIP。
开启内置 GZIP 压缩
Spring Boot 内置了基于 Tomcat/Jetty/Undertow 的响应压缩能力,只需在 application.yml 或 application.properties 中添加配置:
-
启用压缩:
server.compression.enabled=true -
指定压缩 MIME 类型(可选,默认已覆盖常见类型):
server.compression.mime-types=application/json,application/xml,text/html,text/plain -
设置最小响应体大小才压缩(避免小响应徒增 CPU 开销):
server.compression.min-response-size=2048(单位字节,默认即 2KB)
配置生效后,当响应内容类型匹配且长度 ≥ min-response-size,Spring Boot 会自动添加 Content-Encoding: gzip 响应头,并返回压缩后的字节流。
注意 Content-Length 缺失导致压缩失效的问题
当 Controller 返回对象(如 @ResponseBody public Result test()),Jackson 序列化默认使用 chunked 编码,响应头中无 Content-Length,部分嵌入式容器可能无法准确判断是否达到压缩阈值,导致压缩未触发。
将 Spring Boot 2.7 项目升级到 Spring Boot 3.5 的实战流程,覆盖版本基线、依赖坐标替换、Jakarta 迁移、配置兼容、异步上下文传递改造与验证门禁。用于企业多模块 Maven 项目升级与排障。
解决方法是全局强制写入 Content-Length:
- 添加一个
OncePerRequestFilter,在响应写出前计算并设置长度(需缓冲响应体) - 或改用字符串返回 +
@ResponseBody(如return objectMapper.writeValueAsString(result)),此时 Spring 能自动设好Content-Length
手动压缩(适合特殊场景)
若需对特定接口做精细控制(比如只压缩某个大字段、或统一加 Deflate、或压缩后 Base64 编码),可不用内置压缩,而用 Java 标准库手动处理:
- GZIP:用
GZIPOutputStream包装response.getOutputStream() - Deflate:用
DeflaterOutputStream,注意它不带 zlib 头,HTTP 中需设Content-Encoding: deflate,但部分老客户端可能不识别 - 注意手动压缩时要显式设置响应头:
response.setHeader("Content-Encoding", "gzip")和response.setContentType(...)
客户端配合要点
服务端压缩后,客户端必须支持解压才能正常读取:
- 现代浏览器自动处理
Accept-Encoding: gzip, deflate和Content-Encoding: gzip - RestTemplate 默认不发
Accept-Encoding,需手动配置拦截器添加该头;或改用 WebClient(默认支持) - Postman、curl 等工具默认支持,无需额外操作
- 若某次请求不想压缩,可在请求头中移除
Accept-Encoding或设为identity










