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
相关产品推荐
相关产品推荐

