Tomcat触发FileSizeLimitExceededException后连接重置问题排查
问题原因
- 异常抛出时机早于业务代码执行:
FileSizeLimitExceededException是Tomcat的文件上传解析组件在解析请求体阶段抛出的,这个阶段发生在你的ServletdoPost方法执行之前——也就是说,你的try-catch代码还没开始运行,异常就已经被Tomcat容器捕获了,自然无法触发你写的重定向逻辑。 - Tomcat默认行为导致连接重置:当遇到文件大小超限的异常时,Tomcat默认会直接发送
Connection: close头并关闭TCP连接,而不是返回标准的HTTP错误码(比如413 Payload Too Large),这就导致浏览器显示「连接已重置」的错误。 - 错误页面配置不匹配:你只配置了404和500错误码的页面,但文件大小超限对应的是HTTP 413错误,同时Tomcat抛出的是特定的异常类,你的配置没有覆盖这些情况。
解决方案
1. 补充错误页面配置
在项目的web.xml中添加针对413错误码和对应异常类的错误页面:
<!-- 匹配HTTP 413错误码 --> <error-page> <error-code>413</error-code> <location>/error413.jsp</location> </error-page> <!-- 匹配Tomcat抛出的单文件大小超限异常 --> <error-page> <exception-type>org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException</exception-type> <location>/error413.jsp</location> </error-page> <!-- 匹配请求总大小超限的异常 --> <error-page> <exception-type>org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException</exception-type> <location>/error413.jsp</location> </error-page>
2. 修改Tomcat Connector配置,避免直接断开连接
编辑Tomcat安装目录下的conf/server.xml,找到Connector节点,添加maxSwallowSize="-1"参数:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxSwallowSize="-1"/>
这个参数的作用是:当请求体超过允许大小并抛出异常时,Tomcat会读取完整个请求体(而不是直接断开连接),然后返回配置的错误页面,确保浏览器能收到正常的错误响应。
3. 明确try-catch的有效范围
你的try-catch只能捕获请求体解析完成后,在业务代码中抛出的异常。而文件大小超限的异常发生在解析阶段,所以无法被你的代码捕获。如果需要在业务层处理,你可以考虑自己实现文件上传解析逻辑(而不是依赖Tomcat自动解析),但这种方式复杂度较高,推荐使用前面的配置方案。
内容的提问来源于stack exchange,提问作者yaylitzis
相关产品推荐
相关产品推荐

