sizelimitexception是apache commons fileupload在解析请求体时因总大小超限抛出的runtimeexception,需通过filter或handlerexceptionresolver在controller前拦截,推荐自定义filter捕获并返回413响应。

Java中SizeLimitException通常出现在使用Apache Commons FileUpload(如ServletFileUpload)处理文件上传时,当单次请求的总大小(包括文件+表单字段)超过设定限制,框架会抛出该异常。它属于运行时异常(RuntimeException子类),**默认不会被Spring MVC的@ExceptionHandler自动捕获**,需显式配置拦截。
明确异常来源和触发时机
该异常由FileUploadBase.getSizeLimitExceededException()抛出,发生在解析请求体(parseRequest())阶段,早于Spring MVC的Controller执行。因此:
- 不能在Controller内用
@ExceptionHandler直接捕获(此时已抛出并中断流程) - 必须在请求进入Controller前拦截,即在Filter、Servlet或Spring的
HandlerExceptionResolver中处理 - 常见场景:用户上传超大ZIP包、多文件合计超限、恶意构造超长表单字段
推荐方案:自定义Filter拦截并统一响应
在Spring Boot中,最可靠的方式是编写一个前置Filter,在调用chain.doFilter()前尝试解析并捕获异常:
- 创建
FileSizeLimitFilter,注册为@Component或通过FilterRegistrationBean - 对
POST且Content-Type含multipart/form-data的请求,调用ServletFileUpload.parseRequest() - 用
try-catch(SizeLimitException)捕获,设置响应状态码(如413)、返回JSON提示(如{"error":"file_size_exceeded","max":"10MB"}),并return中断链 - 注意:捕获后不要调用
chain.doFilter(),避免重复解析或空指针
替代方案:重写HandlerExceptionResolver(需适配版本)
若项目已使用全局异常处理器,可扩展HandlerExceptionResolver,但需确保它能捕获到该异常:
- 实现
HandlerExceptionResolver接口,重写resolveException() - 检查
exception instanceof SizeLimitException,设置response.setStatus(413)并写入错误体 - 关键点:该Resolver必须在
MultipartFilter之后生效(Spring Boot 2.6+默认启用StandardServletMultipartResolver,异常可能已被其内部吞掉,故Filter方式更稳)
预防性配置(治本)
除了拦截,应在源头控制上限,避免异常频繁触发:
- Spring Boot中配置
spring.servlet.multipart.max-request-size=10MB(影响整个请求) - 若用Apache Commons FileUpload,设置
ServletFileUpload.setFileSizeMax()和setSizeMax() - 前端增加JS校验(如
input.files[0].size),提升用户体验,但不可替代后端校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











