【问题标题】:How to increase the allowed number of headers in springboot如何在spring boot中增加允许的标题数量
【发布时间】:2019-03-07 23:20:31
【问题描述】:

在我的一个应用程序中,我应该发送一个 GET 请求,其中包含我应该通过的 100 多个过滤器字段。当我将此 GET 请求发送到我的 springboot 应用程序之一时,我收到以下错误

java.lang.IllegalStateException: 超过最大允许数量 标题,[100],被检测到。 在 org.apache.tomcat.util.http.MimeHeaders.createHeader(MimeHeaders.java:260) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 org.apache.tomcat.util.http.MimeHeaders.addValue(MimeHeaders.java:305) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 org.apache.coyote.http11.Http11InputBuffer.parseHeader(Http11InputBuffer.java:790) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 org.apache.coyote.http11.Http11InputBuffer.parseHeaders(Http11InputBuffer.java:565) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:703) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_152] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_152] 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.23.jar!/:8.5.23] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_152]

请求一个前进的方向,因为我被困在这个问题上。

【问题讨论】:

  • 你是如何部署应用的?

标签: spring-boot tomcat8


【解决方案1】:

这是在您的 tomcat 容器上配置的。您可以在您正在使用的连接器中的 server.xml 中增加maxHeaderCount。请参阅this 以供参考。如果您的标头很大且标头太多,您可能还需要考虑增加maxHttpHeaderSize

<Connector port="8080" maxHeaderCount="200" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />

使用您正在使用的嵌入式 tomcat,您可以通过编程方式执行此操作。

  @Bean
  EmbeddedServletContainerCustomizer containerCustomizer() throws Exception {
    return (ConfigurableEmbeddedServletContainer container) -> {
      if (container instanceof TomcatEmbeddedServletContainerFactory) {
        TomcatEmbeddedServletContainerFactory tomcat =
            (TomcatEmbeddedServletContainerFactory) container;
        tomcat.addConnectorCustomizers(connector -> {
          Http11NioProtocol handler = (Http11NioProtocol) connector.getProtocolHandler();
          handler.setMaxHeaderCount(200); // set the number
        });
      }
    };
  }

【讨论】:

  • 有没有办法在 Springboot 的 application.properties 中设置这些?
  • 谢谢。 :) 上述工作。如果我可以将上述内容作为配置,那就太好了。
【解决方案2】:

假设您在专用 tomcat 容器中部署和运行应用程序(不在 docker 上或嵌入 spring-boot 的 tomcat。

你可以在server.xml文件中这样增加。

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" maxHeaderCount="300"/>

查看详情: https://tomcat.apache.org/tomcat-8.0-doc/config/http.html

【讨论】:

  • 有什么办法可以在Springboot的应用程序属性中设置maxHeaderCount?
  • 谢谢。 :) 它奏效了。如果我能把它作为配置就好了。
猜你喜欢
  • 2017-03-05
  • 2021-12-18
  • 1970-01-01
  • 2017-08-07
  • 2017-09-15
  • 1970-01-01
  • 2019-01-13
  • 2021-10-23
  • 2015-07-22
相关资源
最近更新 更多