背景html
昨天同事遇到了error一塊兒看了一下感受比較重要在這記錄一下java
基本狀況是頁面上選中9K+的數據向後臺發送請求,而後系統就崩了。。。spring
error信息以下apache
More than the maximum number of request parameters (GET plus POST) for a single request ([10,000]) were detected. api
Any parameters beyond this limit have been ignored. To change this limit, set the maxParameterCount attribute on the Connector.tomcat
簡說 單次請求的參數超出限制,經過maxParameterCount來更改容器的限制。app
經驗裏對於tomcat容器的設定最對就是端口號,超時,最大線程的設置比較多 less
這個【maxParameterCount 】的設定尚未過而後到網上去翻了翻,函數
在官網的文檔(tomcat doc)裏找到了以下spring-boot
maxParameterCount |
The maximum number of parameter and value pairs (GET plus POST) which will be automatically parsed by the container. Parameter and value pairs beyond this limit will be ignored. A value of less than 0 means no limit. If not specified, a default of 10000 is used. Note that FailedRequestFilter filter can be used to reject requests that hit the limit. |
|
The maximum size in bytes of the POST which will be handled by the container FORM URL parameter parsing. The limit can be disabled by setting this attribute to a value less than zero. If not specified, this attribute is set to 2097152 (2 megabytes). Note that the FailedRequestFilter can be used to reject requests that exceed this limit. |
簡說
maxParameterCount 是
tomcat容器來限定你 單次請求的參數的最大數量,默認是10000。因此經過這個屬性你能夠根據狀況給設定適當的值。固然也有超出1w的狀況怎麼辦?
上面文檔裏也有給出答案 小於0的設定能夠禁用此制限。這也是不少網上資料設置-1的緣由。
maxPostSize 是http-post單次請求內容或者說數據的最大限制,默認值爲2M。一樣小於0的設定能夠禁用此制限
具體使用
tomcat/conf/server.xml文件中找到以下節點
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
(這裏有好幾個connector看本身用的是哪一個端口的)
修改後
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxPostSize="-1" maxParameterCount="-1"/>
這是一般的作法,但有時若是tomcat容器內置的話你可能都找不到server.xml文件,
好比spring boo項目內置tomcat
這時候一般會想到 能夠配置在application.properties裏
而後翻一下看看application.properties裏怎麼配置
從spring-boot的doc看到只看到以下
server.tomcat.max-http-post-size=0 # Maximum size in bytes of the HTTP post content. |
並無找到關於maxParameterCount信息,猜想不支持在配置文件裏配置
繼續翻
找到能夠寫在java類裏的方法
@Bean public EmbeddedServletContainerFactory mbeddedServletContainerFactory() { TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory = new TomcatEmbeddedServletContainerFactory(); tomcatEmbeddedServletContainerFactory.addConnectorCustomizers(connector ->{ connector.setMaxPostSize(2); System.out.println("connector.getMaxPostSize: "+connector.getMaxPostSize()); System.out.println("connector.getPort: "+connector.getPort()); }); return tomcatEmbeddedServletContainerFactory; }
代碼自己並很少,過程比較曲折,大概說一下
EmbeddedServletContainerCustomizer
這是一個自定義內置容器的接口,經過實現它能夠建立內置容器
而後還找到已經實現了它類,
AbstractEmbeddedServletContainerFactory,
JettyEmbeddedServletContainerFactory,
TomcatEmbeddedServletContainerFactory,
UndertowEmbeddedServletContainerFactory
這裏看到了定製tomcat容器的工廠類
繼續看看這個類裏都什麼可用(源碼有點多就不貼了貼一張截圖)
這裏就是咱們此次用到的函數了爲何標記兩個由於上邊那個也可用,下面是官網給的說明
固然其它的屬性也能夠在這裏設定貼一下官網鏈接就再也不代碼體現了。