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的结果数据

你可能感兴趣的:(spring,swagger,文件上传,post,web)