You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:56:12