【发布时间】: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-size 和spring.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