上传超大异常不会进入controller层,需通过自定义errorcontroller拦截/error端点处理;前端须用fetch/axios检查status并配置server.error.whitelabel.enabled=false等。

文件上传超大异常(如超出 max-file-size 或 max-request-size)属于 Spring Boot 的底层解析阶段异常,**不会进入 Controller 层,也不会被常规的 @ExceptionHandler 捕获**。这是因为这类异常发生在请求体解析为 MultipartHttpServletRequest 之前,由 Servlet 容器(如 Tomcat)或 Spring 的 StandardServletMultipartResolver 在早期就抛出了。所以必须用专门的方式拦截和处理。
捕获上传超大异常的正确方式
核心是实现 ErrorController 或重写 BasicErrorController,因为这类异常最终会触发 Spring Boot 默认的错误分发机制(/error 端点)。
- 创建自定义错误控制器,覆盖默认行为:
@Controller
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
@ResponseBody
public ApiResponse> handleError(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
Throwable exception = (Throwable) request.getAttribute("javax.servlet.error.exception");
if (400 == statusCode && exception instanceof IllegalStateException &&
exception.getMessage().contains("File size exceeds")) {
return ApiResponse.error(400, "文件大小超出限制,请上传 ≤10MB 的文件");
}
return ApiResponse.error(statusCode != null ? statusCode : 500,
exception != null ? exception.getMessage() : "请求处理失败");
}
@Override
public String getErrorPath() {
return "/error";
}
}
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
补充:前端友好提示的关键细节
浏览器在遇到 400(Bad Request)类上传超限错误时,通常不会触发正常的 AJAX 回调(如 error 函数),而是直接中断请求。因此需配合以下措施:
- 确保前端使用
fetch或axios并显式检查response.status,不要只依赖catch - 后端返回 JSON 响应(而非 HTML 错误页),需配置:
server.error.whitelabel.enabled=falsespring.mvc.throw-exception-if-no-handler-found=true - 在 Nginx / 网关层同步设置上传限制(如
client_max_body_size 50m;),避免请求根本未到达 Spring Boot
不推荐的误区
以下方式对上传超大异常无效:
- 用
@ControllerAdvice + @ExceptionHandler<illegalstateexception></illegalstateexception>—— 此异常不在 DispatcherServlet 异常处理链中 - 试图在 Controller 参数里做校验(如
@Size)—— 请求体都未能解析,校验器根本不会运行 - 修改
MultipartFile.getSize()判断 —— 超限时该对象压根不会被创建
生产环境加固建议
真正稳定的方案要兼顾防御与体验:
- 在上传前做客户端校验(JS 获取
file.size并比对限制值) - 服务端配置合理且明确的限制值,并在 API 文档中标注(如 “单文件 ≤10MB,总请求 ≤50MB”)
- 日志中记录原始异常堆栈(尤其
javax.servlet.error.exception),便于定位是配置问题还是攻击试探 - 对高频 400 错误做监控告警,可能是恶意扫描或前端逻辑缺陷










