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

独立Tomcat部署Spring Boot应用:请求体超过特定字符数自动添加换行问题求助

解决Tomcat上Spring Boot XML请求体自动添加换行的问题

我之前帮同事排查过几乎一模一样的问题,这种超过特定字符数(你这里是49153)就自动插入换行的情况,大概率和Tomcat的请求体读取逻辑或者Spring的消息转换配置有关,咱们一步步来拆解:

先确认问题源头

首先要搞清楚换行是Tomcat传给应用层就有的,还是Spring在处理请求体时加上的:

  • 写一个极简的Filter,直接读取原始请求体的字节流并打印:
    @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层面;如果没有,就是Spring的消息转换器或者自定义处理逻辑加的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:49:09