独立Tomcat部署Spring Boot应用:请求体超过特定字符数自动添加换行问题求助
解决Tomcat上Spring Boot XML请求体自动添加换行的问题
我之前帮同事排查过几乎一模一样的问题,这种超过特定字符数(你这里是49153)就自动插入换行的情况,大概率和Tomcat的请求体读取逻辑或者Spring的消息转换配置有关,咱们一步步来拆解:
先确认问题源头
首先要搞清楚换行是Tomcat传给应用层就有的,还是Spring在处理请求体时加上的:
- 写一个极简的
Filter,直接读取原始请求体的字节流并打印:
如果这里打印的内容已经有换行,那问题出在Tomcat层面;如果没有,就是Spring的消息转换器或者自定义处理逻辑加的。@WebFilter(urlPatterns = "/*") public class RawRequestFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ServletRequest wrappedRequest = new ContentCachingRequestWrapper((HttpServletRequest) request); chain.doFilter(wrappedRequest, response); // 读取原始请求体 byte[] rawBody = ((ContentCachingRequestWrapper) wrappedRequest).getContentAsByteArray(); String bodyStr = new String(rawBody, StandardCharsets.UTF_8); System.out.println("Raw request body length: " + bodyStr.length()); System.out.println("Raw request body:\n" + bodyStr); } }
Tomcat层面的排查与修复
如果确认是Tomcat的问题,核心是调整请求体读取的缓冲区配置:
- 独立Tomcat:修改
conf/server.xml里的Connector配置:<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" bufferSize="65536" <!-- 调整为64KB,超过你的49153阈值 --> maxPostSize="-1" <!-- 允许无限大的POST请求体 --> maxSwallowSize="-1" /> <!-- 确保不会截断请求体 --> - Spring Boot内嵌Tomcat:通过配置类修改:
这里的@Configuration public class TomcatConfig { @Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers(connector -> { if (connector instanceof AbstractHttp11Protocol) { AbstractHttp11Protocol<?> protocol = (AbstractHttp11Protocol<?>) connector; protocol.setBufferSize(65536); protocol.setMaxPostSize(-1); protocol.setMaxSwallowSize(-1); } }); return factory; } }bufferSize默认是8192字节,但有些场景下Tomcat会使用48KB左右的缓冲区(刚好对应你说的49153阈值),调大缓冲区就能避免读取时拆分请求体并引入换行。
Spring层面的排查与修复
如果是Spring处理时加的换行,重点检查XML消息转换器的配置:
- 如果你用的是Jackson XML转换器,确保没有开启自动缩进输出:
@Bean public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter() { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.indentOutput(false); // 必须关闭缩进,否则会自动加换行和空格 builder.modulesToInstall(new JacksonXmlModule()); return new MappingJackson2XmlHttpMessageConverter(builder.build()); } - 如果你用的是JAXB,检查是否配置了
Marshaller.JAXB_FORMATTED_OUTPUT属性,若设为true则改成false即可。
额外排查点
检查是否有第三方过滤器/拦截器(比如Spring Security、APM监控工具的过滤器)在读取请求体时做了拆分处理,有些工具为了日志美观或者性能优化,会自动给长请求体加换行。
我之前碰到的案例就是Tomcat的缓冲区大小刚好卡在48KB左右,调大到64KB后问题直接解决了,你可以先试试这个方向。
内容的提问来源于stack exchange,提问作者Borzi
相关产品推荐
相关产品推荐

