在 Spring Boot 的配置中:
server:
compression:
enabled: true
mime-types: application/json,application/xml,text/html,text/xml,text/plain
min-response-size: 1024
min-response-size: 1024
的含义是 响应内容的最小大小,以字节为单位。即当响应内容的大小达到或超过 1024 字节时,服务器会对该响应内容进行压缩;如果内容小于 1024 字节,则不会启用压缩。
解释
- 单位:1024 表示字节(1 KB),这意味着只有响应内容大小超过 1 KB 时,服务器才会对这些内容进行压缩。
- 作用:避免对小型响应进行压缩,因为压缩较小的数据可能反而增加开销,对性能没有显著的提升。
示例
- 如果返回的数据大小为 500 字节(小于 1024 字节),则不会压缩。
- 如果返回的数据大小为 1500 字节(大于 1024 字节),则会启用压缩。
通过配置 min-response-size
可以优化服务器性能,使压缩只应用于较大的响应内容。
引入带来的问题
解决问题
开启压缩后,服务器会将响应数据以 GZIP 压缩的形式发送给客户端。如果客户端没有正确解压缩这些数据,可能会导致解析失败,因为客户端会尝试将压缩的字节流当作普通文本来读取,结果出现序列化异常。
解决方案
-
确认客户端支持解压缩
- 确保客户端支持并正确处理 GZIP 压缩的数据。在大多数 HTTP 客户端(如浏览器、Postman、Spring RestTemplate)中,设置
Accept-Encoding: gzip, deflate
请求头会自动解压缩响应内容。
- 确保客户端支持并正确处理 GZIP 压缩的数据。在大多数 HTTP 客户端(如浏览器、Postman、Spring RestTemplate)中,设置
-
检查是否自动解压缩(Spring RestTemplate 示例)
- 如果使用 Spring 的
RestTemplate
作为客户端,它应该能够自动处理 GZIP 响应,但确保请求头包含Accept-Encoding: gzip, deflate
。
HttpHeaders headers = new HttpHeaders(); headers.add("Accept-Encoding", "gzip, deflate"); HttpEntity<String> requestEntity = new HttpEntity<>(headers); ResponseEntity<String> response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, String.class);
- 如果使用 Spring 的
-
关闭 GZIP 压缩(临时解决方案)
- 如果您无法保证客户端正确解压缩数据,可以考虑在服务器端禁用压缩以避免异常:
server: compression: enabled: false
-
调整 MIME 类型
- 如果只希望压缩特定类型的响应(例如,HTML 和 XML),可以修改
mime-types
配置,排除application/json
:
server: compression: enabled: true mime-types: application/xml,text/html,text/xml,text/plain # 排除 application/json min-response-size: 1024
- 如果只希望压缩特定类型的响应(例如,HTML 和 XML),可以修改
通过上述调整,您可以避免由于压缩导致的客户端解析错误。最优方案是确保客户端正确处理 GZIP 响应,避免禁用压缩带来的性能影响。