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

Spring Integration:自定义HTTP头透传被转小写,如何保留原格式?

保留自定义HTTP头的原始大小写格式

嘿,这个问题我之前帮朋友排查过,其实核心原因和Servlet容器的默认行为有关,咱们来一步步解决它~

首先,你遇到的头被转成小写的情况,大多是因为Servlet容器(比如Tomcat、Jetty)默认会将HTTP头名称转换为小写,即使HTTP协议本身对头的大小写不敏感,但容器的这个处理会覆盖你想要的原始格式。要解决这个问题,需要从两个层面入手:调整容器配置,再确保Spring Integration的头映射逻辑不额外修改大小写。

1. 调整Servlet容器配置(以Tomcat为例)

从Tomcat 9.0.41版本开始,提供了preserveHeaderCase属性来保留HTTP头的原始大小写。如果是使用嵌入式Tomcat,可以通过配置类添加这个设置:

@Bean
public TomcatServletWebServerFactory tomcatFactory() {
    return new TomcatServletWebServerFactory() {
        @Override
        protected void customizeConnector(Connector connector) {
            super.customizeConnector(connector);
            // 开启保留HTTP头大小写的配置
            connector.setProperty("preserveHeaderCase", "true");
        }
    };
}

如果是使用独立Tomcat,需要在server.xml的Connector节点中添加该属性:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           preserveHeaderCase="true"/>

2. 确保Spring Integration的HeaderMapper不修改头名称

默认的DefaultHttpHeaderMapper在映射头的时候,会直接使用传入的头名称,但为了保险起见,你可以显式自定义一个HeaderMapper,确保它不会对头名称做大小写转换:

@Bean
public HeaderMapper<HttpHeaders> customHeaderMapper() {
    DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
    // 配置需要映射的请求头和响应头
    mapper.setInboundHeaderNames(new String[]{"X-My-Header", HTTP_REQUEST_HEADER_NAME_PATTERN});
    mapper.setOutboundHeaderNames(new String[]{"X-My-Header", HTTP_RESPONSE_HEADER_NAME_PATTERN});
    // 清空自定义头前缀,避免额外修改名称
    mapper.setUserDefinedHeaderPrefix("");
    return mapper;
}

然后在你的IntegrationFlow中使用这个自定义的HeaderMapper:

@Bean
public IntegrationFlow myFlow() {
    return IntegrationFlows
           .from(Http.inboundGateway("/myresource/{transactionId}")
                   .headerMapper(customHeaderMapper())
                   // 其他配置...
                   )
           // 后续流程...
           .get();
}

其他容器的配置参考

如果你使用的是Jetty,需要在HttpConfiguration中开启preserveHeaderCase:

@Bean
public JettyServletWebServerFactory jettyFactory() {
    JettyServletWebServerFactory factory = new JettyServletWebServerFactory();
    factory.addServerCustomizers(server -> {
        HttpConfiguration httpConfig = new HttpConfiguration();
        httpConfig.setPreserveHeaderCase(true);
        ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfig));
        server.setConnectors(new Connector[]{connector});
    });
    return factory;
}

完成以上配置后,你的自定义头X-My-Header就会以原始的大小写格式在响应中返回了~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:13:28