Spring 引导应用程序中达到的最大请求参数数



我有一个使用多重上传来更新有时大量文件的 10K+。在这些情况下,我遇到了这个异常。我猜它正在查看我的"files"参数,并看到它是一个 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-size并在那里spring.http.multipart.max-request-size。我没有在这个来源中找到任何与maxParameterCount等同的东西。

此外,假设有一种方法可以为使用 spring 启动(嵌入 tomcat )在本地运行的实例设置它,该更改是否也适用于 deploymenet 环境,或者是否需要更改 tomcat 配置?

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

@Configuration
public class TomcatCustomizationConfiguration {
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
final int maxHttpRequests = 50000;
TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
tomcatFactory.addConnectorCustomizers(connector -> connector.setMaxParameterCount(maxHttpRequests));
return tomcatFactory;
}
}

根据 Spring 文档,您可以通过扩展 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));
}
}

:注:我实际上在这个博客上找到了解决方案。