如何增加springboot中允许的标头数量

时间:2018-10-02 19:15:57

标签: spring-boot tomcat8

在我的一个应用程序中,我应该发送一个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]

在我坚持下去的同时,要求前进的道路。

2 个答案:

答案 0 :(得分:0)

这是在您的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
        });
      }
    };
  }

答案 1 :(得分:0)

假设您要在专用的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