Spring Boot内嵌Tomcat服务如何禁用响应头的Transfer-Encoding?
搞定这个问题不难,针对你用Spring Boot 2.0.1.RELEASE内嵌Tomcat搭建的REST服务出现Transfer-Encoding: chunked导致响应格式异常的情况,我整理了几个靠谱的解决方案:
方案1:定制Tomcat Connector全局禁用Chunked编码
这是最彻底的全局解决方案,通过配置类修改内嵌Tomcat的Connector参数,强制关闭chunked传输:
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatChunkConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatChunkCustomizer() { return factory -> factory.addConnectorCustomizers(connector -> { // 禁用chunked编码 connector.setProperty("sendChunked", "false"); // 设置默认内容长度阈值,避免Tomcat自动触发chunked connector.setProperty("maxSavePostSize", "0"); }); } }
把这个配置类放到你的Spring Boot项目里,启动后Tomcat就不会再给响应加Transfer-Encoding: chunked头了。
方案2:在Controller接口手动设置Content-Length头
如果只需要针对个别接口禁用chunked,可以在接口里手动计算响应内容的字节长度并设置Content-Length头——Tomcat检测到这个头存在时,会自动放弃chunked编码:
import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoRestController { @GetMapping("/your-api-path") public ResponseEntity<String> getCustomResponse() { // 你的预期JSON响应内容 String jsonContent = "{\"status\":\"success\",\"data\":\"your-content\"}"; HttpHeaders headers = new HttpHeaders(); // 计算JSON内容的字节长度(注意编码要和响应一致) headers.setContentLength(jsonContent.getBytes(java.nio.charset.StandardCharsets.UTF_8).length); return ResponseEntity.ok().headers(headers).body(jsonContent); } }
这种方式需要每个目标接口都单独处理,适合不需要全局禁用的场景。
方案3:检查并修正编码配置
你之前尝试了部分编码配置,可能配置不完整导致Tomcat无法准确计算响应长度,进而触发chunked。可以把application.properties里的编码配置补全:
# 确保全局编码配置正确 spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8
虽然这个配置不会直接禁用chunked,但能避免因编码不一致导致的响应长度计算错误,间接防止Tomcat自动启用chunked。
注意事项
- 如果你的接口返回大文件或者不确定长度的响应,不建议禁用chunked,否则可能会占用过多内存;但对于固定长度的JSON响应,禁用是完全安全的。
- 如果你使用了
@ResponseBody或@RestController,确保Spring的MessageConverter没有强制启用chunked(默认不会,但可以检查相关配置)。
内容的提问来源于stack exchange,提问作者soufrk
相关产品推荐
相关产品推荐

