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

背景

使用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的结果数据
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值