最近在使用一个文件上传组件。发现在上传文件时出现了以下问题:
1.文件上传文本类型的文件,txt,xml 等类型是正常的。
2.媒体类型文件上传会出现异常。异常如下:
[WARN] 2018-10-22 14:33:00 390 - Unable to parse request org.apache.commons.fileupload.FileUploadException: Connection reset at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362) at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parseRequest(JakartaMultiPartRequest.java:192) at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.processUpload(JakartaMultiPartRequest.java:131) at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parse(JakartaMultiPartRequest.java:92) at org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper.<init>(MultiPartRequestWrapper.java:84) at org.apache.struts2.dispatcher.Dispatcher.wrapRequest(Dispatcher.java:849)
Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:196) at java.net.SocketInputStream.read(SocketInputStream.java:122) at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:756)
这个问题在测试环境中没有出现,各种文件类型上传正常。但是到了正式环境就出问题。经过很长时间的调试(远程调试),发现代码执行的时候没有进到action类就会直接报错。各种测试,仍然找不到问题的根源。
然后在搜索的时候发现了各种类似的问题:
1.有的是上传文件太大,触发了tomcat上传限制。上传文件大小不是问题,主要是文件类型的问题。
2.重复请求导致连接重置。排查了连接情况,不属于这种情况。
3.在环境中,上传文件时需要先生成临时文件,如果临时文件夹在服务器中没有权限,创建临时文件失败会导致上传文件失败。排除,在服务器中,整个tomcat文件夹和其子目录都有权限。而默认情况下,临时文件夹会在tomcat下的work目录下子目录创建临时文件。除非特别配置了该临时文件夹路径,否则一般不会出现这个问题。
4.网络问题,防火墙配置拦截资源。很有可能,然后排查目标服务器上的防火墙,没有开启。
一次偶然,发现该服务器上的项目一个网页中的音频文件播放失败,播放时阻塞,浏览器调试窗没有报错。发现浏览器加载该资源成功,就是不能播放。抓包发现连接有问题。
只是在请求一个wav文件,但是返回的却是文本数据。而且连接也是会复位。更加确定是被拦截了。最后发现是公司网络对音频网络资源进行了拦截。可能是为了不让你上班看视频,听音乐吧。使用手机热点进行访问服务器并上传文件,正常使用。这解释了为什么测试环境没有问题,因为公司内部网络不会进行拦截。
总结,当connect reset出现,可以通过切换网络访问测试,看是否有防火墙拦截问题。