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

Spring Boot应用因Ingress传递的TLS请求头异常导致请求失败

解决Spring Boot + Kubernetes Ingress双向TLS下的HttpMediaTypeNotSupportedException问题

我之前也踩过一模一样的坑——Ingress传递的带换行符的客户端证书请求头(比如Ssl-Client-Cert)会干扰Spring Boot的请求解析流程,导致它误判请求的Content-Type为null,哪怕你明明携带了Accept: application/json头。下面是几个经过实际验证的解决方案:

方案1:在Ingress层清理证书头的换行符

最直接的思路是不让带换行的请求头进入Spring Boot应用。如果用的是Nginx Ingress,可以通过配置代码段修改Ssl-Client-Cert的内容,移除所有换行符:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: your-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite_by_lua_block {
        local cert = ngx.var.ssl_client_cert
        if cert ~= nil then
          -- 移除证书中的所有换行符,转为单行字符串
          cert = string.gsub(cert, "\n", "")
          ngx.var.ssl_client_cert = cert
        end
      }
    # 双向TLS的基础配置(根据你的实际情况调整)
    nginx.ingress.kubernetes.io/ssl-verify-client: "on"
    nginx.ingress.kubernetes.io/ssl-verify-depth: "1"
    nginx.ingress.kubernetes.io/ssl-client-certificate: "your-client-ca-secret"

处理后传递给Spring Boot的证书头就是单行字符串,不会触发解析异常。

方案2:调整Spring Boot的Tomcat连接器配置

如果不想修改Ingress,可以直接调整Spring Boot底层Tomcat的请求头解析规则,允许换行符出现在请求头中。

方式A:通过配置文件快速修改

在application.properties中添加:

# 允许请求头包含换行符和反斜杠
server.tomcat.relaxed-header-chars=\n,\\
# 指定需要解析Body的HTTP方法,避免Tomcat误判请求类型
server.tomcat.parse-body-methods=POST,PUT,PATCH,GET,DELETE

方式B:自定义Tomcat连接器配置

如果需要更精细的控制,可以编写配置类:

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 TomcatHeaderConfig {

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return factory -> factory.addConnectorCustomizers(connector -> {
            // 放行请求头中的换行符和反斜杠
            connector.setProperty("relaxedHeaderChars", "\n,\\");
            // 仅对指定方法解析Body,避免干扰GET/DELETE等请求
            connector.setParseBodyMethods("POST,PUT,PATCH");
        });
    }
}

方案3:升级Spring Boot版本

某些旧版本的Spring Boot(比如2.6.x及之前)在处理带特殊字符的请求头时存在兼容性bug,升级到2.7.x或更高的稳定版本(比如3.x系列),官方可能已经修复了这个解析异常问题。

验证步骤

修改完成后,你可以用httpbin再次测试:

  1. 发送带双向TLS的请求,确认Ssl-Client-Cert等头正常传递
  2. 查看Spring Boot日志,确认不再抛出org.springframework.web.HttpMediaTypeNotSupportedException
  3. 验证控制器方法能正常接收并处理请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:36:54