【问题标题】:Max number of request parameters reached in spring boot applicationSpring Boot 应用程序中达到的最大请求参数数
【发布时间】:2017-05-10 18:43:59
【问题描述】:

我有一个 Spring Boot 应用程序,它使用多次上传来更新有时 10K+ 的大量文件。在这些情况下,我遇到了这个例外。我猜它正在查看我的“文件”参数并看到它是一个 > 10K 的数组并标记此异常。我还发送了另一个参数,它是与文件列表关联的字符串数组,其大小是文件数,> 10K

java.lang.IllegalStateException: More than the maximum number of request parameters (GET plus POST) for a single request ([10,000]) were detected. Any parameters beyond this limit have been ignored. To change this limit, set the maxParameterCount attribute on the Connector.
    at org.apache.tomcat.util.http.Parameters.addParameter(Parameters.java:204) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.connector.Request.parseParts(Request.java:2860) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.connector.Request.parseParameters(Request.java:3177) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.connector.Request.getParameter(Request.java:1110) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381) ~[tomcat-embed-core-8.5.11.jar:8.5.11]

我理解这个例外,但我试图找出我的application.properties 中的哪个位置可以调整它。我在那里设置了spring.http.multipart.max-file-sizespring.http.multipart.max-request-size。我在这个source 中找不到任何与maxParameterCount 相当的东西。

另外,假设我可以通过 Spring Boot(嵌入 tomcat)为本地运行的实例设置它,那么该更改是否也适用于 deploymenet 环境,或者是否需要更改 tomcat 配置?

更新:我找到了一个在使用 spring boot 在本地运行时有效的解决方案。我假设由于这正在更改 Tomcat Embedded 实例,因此这不适用于已部署的完整 tomcat 环境——我想知道是否有一种解决方案可以在两个 tomcat 实例中工作。

@Configuration
public class TomcatCustomizationConfiguration {

    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
        final int maxHttpRequests = 50000;
        TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();

        tomcatFactory.addConnectorCustomizers(connector -> connector.setMaxParameterCount(maxHttpRequests));

        return tomcatFactory;
    }
}

【问题讨论】:

  • 连接器是 Tomcat 配置。 stackoverflow.com/questions/17105549/… 至于如何用 Spring Boot 设置,不太清楚,所以不标记为骗子。
  • 如果您希望它在“真实”/共享的 tomcat 实例中工作,您应该直接更改容器配置,而不是以编程方式更改,因为它们是服务器范围的(如果另一个部署的应用程序需要 500 个最大参数怎么办? ,而你想要 2 万个?)。这将在 server.xml 中通过在您的 <Connector . . .> 定义中添加 maxParameterCount=". . ." 来完成。
  • 您是说我的应用程序代码不应更改服务器范围的设置,但设置服务器范围的配置文件是否可以接受?

标签: java spring tomcat spring-boot


【解决方案1】:

根据Spring documentation,您可以通过扩展WebServerFactoryCustomizer自己添加缺少的配置:

如果您的用例不存在配置键,则应查看 WebServerFactoryCustomizer。您可以声明这样的组件并获得对服务器工厂和所选 Web 堆栈的访问权限。

由于还没有server.tomcat.max-parameter-count 配置,您可以像 OPs 配置代码一样添加它:

@Configuration
public class TomcatCustomizationConfiguration implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
    @Value("${server.tomcat.max-parameter-count:10000}")
    private int maxParameterCount;

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.addConnectorCustomizers(connector -> connector.setMaxParameterCount(maxParameterCount));
    }
}

注意我实际上在 this 博客上找到了解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多