springboot上传文件过大,全局异常捕获,浏览器没有返回数据

2 篇文章 0 订阅
1 篇文章 0 订阅

背景

使用springboot上传大文件,项目里进行全局异常处理,上传文件超过配置文件max大小,异常被捕获,浏览器端没有任何返回值。
从后台报错日志来看,异常已经被全局异常处理捕获到了,并且也已经完成响应,而前端(swagger,browser)没有看到返回信息

应用技术栈:springboot,ControllerAdvice,swagger,fileupload

现象

  1. 浏览器显示
net:: ERR_CONNECTION_ABORTED

或者

!Provisional headers are shown
  1. swagger显示:
TypeError: Failed to fetch
  1. curl显示:
HTTP/1.1 100 

HTTP/1.1 500 
Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS
Access-Control-Allow-Credentials: true
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self'
Content-Type: application/json;charset=UTF-8
Content-Length: 400
Date: Mon, 26 Apr 2021 03:04:28 GMT
Connection: close

{"timestamp":1619406268972,"status":500,"error":"Internal Server Error","message":"Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size \u002891871897\u0029 exceeds the configured maximum \u002862914560\u0029","path":"/xxserver/fileupload"}

解决方案

  1. 根据实际规格资源限制,配置如下参数,并在业务逻辑中进行文件大小的判断
spring.servlet.multipart.max-file-size=${size}
spring.servlet.multipart.max-request-size=${size}
server.tomcat.max-swallow-size=${size}

  1. 当前端有代理层资源限制(比如nginx限制上传文件大小)时,配置size=-1即可

背后原因

根本原因在于浏览器处理请求和curl/postman的处理方式有差异,浏览器在处理案例中http请求时,

  1. 浏览器request请求已发送,但是因为MaxUploadSizeExceededException异常导致数据没有发送完成。
  2. 浏览器在处理post请求过程中,如果请求没有完成(该场景中,上传文件数据没有完成),response信息会被浏览器吞没;所以在swagger-ui界面或者浏览器上没有看到response信息。
  3. 当使用curl或者postman做文件上传时,输出了500错误,以及全局异常拦截器handle的结果数据
在 Spring Boot 中,可以通过实现一个全局异常处理器来捕获应用程序中的异常,并对异常进行统一处理。 实现一个全局异常处理器的步骤如下: 1. 创建一个异常处理器类,用于处理应用程序中的异常。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse errorResponse = new ErrorResponse("500", ex.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 2. 在异常处理器类上加上 @ControllerAdvice 注解,表示这是一个全局异常处理器。 3. 在异常处理器类中定义异常处理方法,使用 @ExceptionHandler 注解指定要处理的异常类型。在异常处理方法中,可以处理异常返回一个自定义的错误响应实体。 4. 在异常处理方法中使用 ResponseEntity 类来封装错误响应实体,并指定 HTTP 状态码。这里示例使用了 500 状态码。 5. 配置 Spring Boot 应用,使其能够扫描到异常处理器类。可以在启动类上加上 @ComponentScan 注解来指定扫描路径。 ```java @SpringBootApplication @ComponentScan(basePackages = "com.example.demo") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 以上就是在 Spring Boot 中实现全局异常处理的步骤。通过实现全局异常处理器,可以有效地统一处理应用程序中的异常
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值