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

Spring Boot 3 @GetMapping接口为何需设置content-length:0才能正常响应?

问题描述

使用spring-boot-starter-parent:3.0.2搭建的Spring Boot 3项目中,@RestController下的@GetMapping接口出现异常:仅当请求头包含content-length:0时能正常响应,否则返回HTTP 400「错误请求」。

  • Spring RestTemplate编写的集成测试可正常调用,因为RestTemplate会自动添加该请求头;
  • JMeter测试时报错,因GET请求未携带Content-Length头,而这符合RFC 9110规范:「当请求无内容且方法语义不期望数据时,用户代理不应发送Content-Length头」。

初始代码:

@RestController
@RequestMapping("/v1/myService")
@Component
@Slf4j
class GetServlet {
  @GetMapping(value = "/greeting", produces = "text/plain")
  public ResponseEntity getGreeting() {
    log.debug("Sending greeting");
    return ResponseEntity.ok("Hello world!");
  }
}

移除produces参数后问题依旧:

@RestController
@RequestMapping("/v1/myService")
@Component
@Slf4j
class GetServlet {
  @GetMapping(value = "/greeting")
  public ResponseEntity getGreeting() {
    log.debug("Sending greeting");
    return ResponseEntity.ok()
            .contentType(MediaType.valueOf("text/plain"))
            .body("Hello world!");
  }
}
可能的触发原因
  • Servlet容器的严格校验配置:Spring Boot 3默认使用Tomcat 10.1.x,若容器开启了严格的请求头解析规则(如strictHeaderParsing=true),或存在请求体校验逻辑误判,可能将无Content-Length的GET请求判定为非法。
  • 自定义拦截器/过滤器的错误处理:项目中自定义的拦截器、过滤器可能未区分HTTP方法语义,强制要求所有请求携带Content-Length头,导致无请求体的GET请求被拦截返回400。
  • Spring MVC的内容协商或请求匹配冲突:全局内容协商配置、或其他@RequestMapping的consumes属性设置,可能让Spring MVC错误期望GET请求携带内容,从而拒绝无Content-Length的请求。
  • 依赖版本的特定Bug:spring-boot-starter-parent:3.0.2对应的Spring MVC或Tomcat版本可能存在特定Bug,导致对无Content-Length的GET请求处理异常。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:25:21