如何在 spring boot 中增加 headers 的允许数量

How to increase the allowed number of headers in springboot

在我的一个应用程序中,我应该发送一个 GET 请求,其中包含我应该传递的 100 多个筛选字段。当我将此 GET 请求发送到我的一个 springboot 应用程序时,出现以下错误

java.lang.IllegalStateException: More than the maximum allowed number of headers, [100], were detected. at org.apache.tomcat.util.http.MimeHeaders.createHeader(MimeHeaders.java:260) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] at org.apache.tomcat.util.http.MimeHeaders.addValue(MimeHeaders.java:305) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] at org.apache.coyote.http11.Http11InputBuffer.parseHeader(Http11InputBuffer.java:790) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] at org.apache.coyote.http11.Http11InputBuffer.parseHeaders(Http11InputBuffer.java:565) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:703) ~[tomcat-embed-core-8.5.23.jar!/:8.5.23] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.23.jar!/:8.5.23] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-8.5.23.jar!/:8.5.23] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.23.jar!/:8.5.23] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.23.jar!/:8.5.23] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_152] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_152] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.23.jar!/:8.5.23] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_152]

请求前进的道路,因为我坚持这一点。

这是在您的 tomcat 容器上配置的。您可以在您正在使用的连接器中增加 server.xml 中的 maxHeaderCount。请参阅 this 以供参考。如果您的 header 大小很大且 header 如此之多,您可能还需要考虑增加 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
        });
      }
    };
  }

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

你可以在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