tomcat 处理http post请求配置
1.背景介绍
最近做新闻资讯类相关项目,涉及到富文本,在富文本上传本地图片并添加资讯后将内容通过接口入库时接口长时间无响应。
经查,前端在富文本上传本地图片时设置了图片数据用Base64编码字符串进行传输,而Base64文本会随着文件的增大而变得特别长,例如我本地上传了一个400Kb的图片,转换后的Base64文本多达544408个字符,传入接口后,接口也无响应超时,同时整个网页都崩溃了。
查询日志,显示如下报错信息:
java.lang.IllegalArgumentException: Request header is too large at org.apache.coyote.http11.AbstractNioInputBuffer.parseHeaders(AbstractNioInputBuffer.java:392) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1025) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)
2.错误分析
原因:请求头Header超过了tomcat的限值,需要修改tomcat的配置项
3.解决方案
因为我的项目是SpringBoot项目,所以此时分两种情况:
3.1 本地服务,因为使用的是springboot的内置tomcat服务器,所以在application.properties文件中添加
server.tomcat.max-http-post-size=-1
server.tomcat.max-http-header-size=102400
3.2 当项目部署在服务器上时,此时使用的非内置tomcat,需在tomcat安装目录/config/server.xml文件的Connector配置中增加2个参数:maxPostSize="-1" maxHttpHeaderSize ="102400"
具体如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxHttpHeaderSize ="102400" maxPostSize="-1"/>
PS:
maxHttpHeaderSize表示请求头大小,缺省为8192(8KB),此处应内容较大,改为102400,可视具体情况修改。
maxPostSize表示post请求大小,缺省为2097152(2MB),此属性设置为小于零的值来禁用该限制。所以此处设置为-1。
另外,需要注意的是,不同版本的tomcat设置maxPostSize是不同的,在7.0.63版本之前,当小于或等于0可以取消大小限制,在7.0.63(包含)之后,需设置成小于0才能取消大小限制。
(这里之前查了很多回答都说将maxPostSize设置为0,但试验之后发现不起作用,后面查tomcat官方文档,才发现这处区别,记录一下。)
PPS 在tomcat限制上传文件的大小配置
1.如果是springboot内置tomcat,配置如下:
spring.servlet.multipart.enabled =true spring.servlet.multipart.file-size-threshold =0 spring.servlet.multipart.max-file-size = 100Mb spring.servlet.multipart.max-request-size=100Mb
2.linux tomcat服务器则到webapps\manager\WEB-INF\web.xml下找到
<multipart-config>
<!-- 50MB max -->
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
根据实际情况进行相应的修改。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下为相关内容拓展:
1> GET URL长度限制
在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的,HTTP协议并不对URI的长度做任何的限制,服务器端 必须能够处理任何它们所提供服务多能接受的URI,并且能够处理无限长度的URI,如果服务器不能处理过长的URI,那么应该返回414状态码。
虽然Http协议规定了,但是Web服务器和浏览器对URI都有自己的长度限制。
服务器的限制:我接触的最多的服务器类型就是Nginx和Tomcat,对于url的长度限制,它们都是通过控制http请求头的长度来进行限制 的,nginx的配置参数为large_client_header_buffers,tomcat的请求配置参数为 maxHttpHeaderSize,都是可以自己去进行设置。
client_header_buffer_size 512k;
large_client_header_buffers 7 512k;
浏览器的限制:每种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)
-
IE : 2803
-
Firefox:65536
-
Chrome:8182
-
Safari:80000
-
Opera:190000
对于get请求,在url的长度限制范围之内,请求的参数个数没有限制。
2. Post数据的长度限制
Post数据的长度限制与url长度限制类似,也是在Http协议中没有规定长度限制,长度限制可以在服务器端配置最大http请求头长度的方式来实现。 nginix默认限制1M
可以选择在http{ }中设置:
client_max_body_size 20m;
也可以选择在server{ }中设置:
client_max_body_size 20m;
还可以选择在location{ }中设置:
client_max_body_size 20m;
三者到区别是:http{}中控制着所有nginx收到的请求。而报文大小限制设置在server{}中,则控制该server收到的请求报文大小,
同理,如果配置在location中,则报文大小限制,只对匹配了location 路由规则的请求生效。
http{
#控制全局nginx所有请求报文大小
#client_max_body_size 20m;
server{
#控制该server的所有请求报文大小
#client_max_body_size 20m;
location a {
}
location b{
#控制满足该路由规则的请求报文大小
#client_max_body_size 20m;
}
}
server {
}
}
3. Cookie的长度限制
Cookie的长度限制分这么几个方面来总结。
(1) 浏览器所允许的每个域下的最大cookie数目,没有去自己测试,从网上找到的资料大概是这么个情况
-
IE :原先为20个,后来升级为50个
-
Firefox: 50个
-
Opera:30个
-
Chrome:180个
-
Safari:无限制
当Cookie数超过限制数时浏览器的行为:IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉,Firefox的行为是随机踢出某些Cookie的值。当然无论怎样的策略,还是尽量不要让Cookie数目超过浏览器所允许的范围。
(2) 浏览器所允许的每个Cookie的最大长度
-
Firefox和Safari:4079字节
-
Opera:4096字节
-
IE:4095字节
(3) 服务器中Http请求头长度的限制。Cookie会被附在每次http请求头中传递给服务器,因此还会受到服务器请求头长度的影响。