Struts2文件上传 超过大小限制无法跳转至指定input页面问题。浏览器提示连接已重置问题:
根本原因:
此问题在用tomcat7/8/9版本会出现。根本原因是Tomcat7/8/9与struts2的兼容性问题:
当request的最大的字节数(不包括传输编码开销)超过tomcat服务器conf文件server.xml中maxSwallowSize的设置值将会被Tomcat终止上传,tomcat会判定是个失败的上传,
不会把这个request再传送到应用的servlet对象,所以不会有应用的servlet对这个request没有任何响应。
但是客户端收不到超过上传限制的response,所以客户端会仍然发送它。所以tomcat会发送一个
连接重置给客户端(浏览器)。
这样就会出现文件上传 超过大小限制无法跳转至指定input页面,浏览器提示连接已重置的问题。
************************************************************
回复信息:
-
chuan_jing
2017-07-14 04:381楼 -
-
很感谢,按照你的方式能解决!但我有一点不明白:在我没有配置maxSwallowSize="-1"时,使用原生commons-fileupload来上传大文件,或者使用servlet3.0上传大文件,浏览器都没有提示连接已重置,都可以上传成功,唯独使用struts2时上传大文件会被tomcat拦截下来,按照这个现象来说,不应该是tomcat的配置问题啊,能帮我解释解释吗?
-
-
-
zyw23zyw23
2017-07-14 10:162楼 -
按照你的调试结果,不应该是tomcat的配置问题,而是Struts2的问题。
你可以在你说的三种方式上进行断点调试,重点在第三种情形用户上传时tomcat生成单实例Servlet后,struts2过滤器过滤过程中的调用doFilter()语句前,如你所述问题很大可能应该出现在这里。
1,用户上传------tomcat(生成单实例servlet3.0)------自己编写上传函数。
2,用户上传------tomcat(生成单实例servlet)------commons-fileupload。
3,用户上传------tomcat(生成单实例servlet)------struts2------commons-fileupload。 -
-
zyw23zyw23
刚刚 -
回复chuan_jing:今天在遇到sringMVC 转发到jsp时出现405错误:JSPs only permit GET POST or HEAD的问题时,突然想到你的这个疑问,其实不是Tomcat的问题,也不是struts2的问题,而是Tomcat7/8/9与struts2的兼容性问题(我猜想是:因为Tomcat的版本更迭,添加了新功能,新的安全特性,在Tomcat提供给struts2的信息流中,相比以前版本的Tomcat的信息流的某些信息发生改变,但struts2没有针对这些改变做相应的调整,这就出现了兼容性的问题,所以出现上述情况)。
-
*************************************************************
解决方法:修改maxSwallowSize为-1,注意:-1不一定适合实际应用,
tomcat服务器conf文件server.xml中maxPostSize与maxSwallowSize的设置值:如果没有指定默认的2097152(2MB)的默认值,小于0表示无限制。
例子:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" maxSwallowSize="-1"/>
这样就会正常跳转到自己定义好的input错误页面。
实际的应用中maxSwallowSize的值是要根据业务需求设置,因为超过maxSwallowSize的值的request,tomcat服务器不传到应用的Servlet对象,所以解决方法有两种:
1. 通过tomcat服务器层面设置解决,这个问题超出本人的能力范围了。
2. 另外可以在前端页面上传文件时进行是否超出文件上传的限制值进行判断提示,配合设置适当的maxSwallowSize的值使用。