今天在开发从远程服务器下载文件输出到浏览器,前端调试时报错java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
网上的解决办法很多,这里对这个问题总结一下,避免下次遇到。
原因一:远程服务器上Tomcat设置响应时间过短,默认是20s,如果下载文件过大,时间过长,则可能会导致文件下载失败,出现broken pipe
异常。
如果是这个原因,可以找到Tomcat中/conf目录下的配置文件server.xml
,修改其中的配置:
<Connector connectionTimeout="60000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
但是我的文件下载基本都在一两秒,排除这个原因。
原因二:有网友说是Tomcat的版本问题,但是我的接口在浏览器地址栏中可以正常访问,说明不是Tomcat的问题,故排除。
原因三:跨域问题导致。网上说要设置response的请求头属性。果然加上之后,前端调用接口正常。
response.addHeader("Access-Contro1-Allow-Origin”, "*");
猜测应该是本地程序获取远程服务器上的文件流时导致的跨域问题,但是有待验证。
原因四:网上说,还有一种情况是因为前端代码引起的,未验证,仅供参考。
1、异常表现:我在jsp文件中有一个表单,里面有一个保存事件按钮。保存
onclick的js函数里我是用ajax提交的数据,用于局部刷新页面。
2、问题原因:在Internet Explorer 的默认类型是 “button”,而其他浏览器中(包括 W3C 规范)的默认值是 “submit”。
所以导致了表单重复提交。出现“java.io.IOException: 你的主机中的软件中止了一个已建立的连接”异常。
3、问题解决:把代码 改为保存,为按钮定义Type属性为button。