当前位置:
【踩坑笔记】SpringBoot设置全局捕获MaxUploadSizeExceededException异常
机器助手 |
112人浏览
需求:在Spring Boot项目中对来自前端的文件上传请求做大小限制,限制文件大小在20mb以内,超出则提示“文件大于20mb”
自定义全局异常 相应代码
java全局异常拦截代码
@ExceptionHandler({MaxUploadSizeExceededException.class})
public DataSet maxUploadSizeExceededException(MaxUploadSizeExceededException maxUploadSizeExceededException) {
log.info("=====================文件大于100mb====================");
log.info(maxUploadSizeExceededException+"");
return new DataSet.error("文件超过大于限制100mb");
}
yml配置
spring:
servlet:
multipart:
max-file-size: 100mb
max-request-size: 100mb
结果报错
org.springframework.web.multipart.MaxUploadSizeExceededException:
Maximum upload size exceeded; nested exception is java.lang.IllegalStateException:
org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException:
the request was rejected because its size (10935680) exceeds the configured maximum (10485760)
百度好多资料,说是超出tomcat内置的文件大小设置异常会先于controller触发导致异常无法捕获
按照百度提供的解决方案:配置yml
spring:
servlet:
multipart:
enabled: true #默认支持文件上传
max-file-size: 100mb
max-request-size: 100mb
resolve-lazily: true #设置为懒加载,不然依然会捕获不到异常
tomcat:
max-swallow-size: 100MB #最重要的是这行
结果依然不可以,有一点奇怪的是
这里可以打印,说明可以触发异常的,都是前端响应结果
前端使用的是Vue,axios
this.$axios({
method:"post",
url:"/imgUpDown",
data:formData,
headers: {'Content-Type': 'multipart/form-data'}
}).then(res => {
console.log("响应成功:服务端返回值为:",res)
}).catch(e=>{
console.log("请求失败:错误信息:",e)
})
前端就是不响应后端自定义捕获异常封装的结果
…若干个小时以后。。。
最后乱试了一下nginx的配置发现了巨坑
1)resolve-lazily: true 这个是重点不然捕获不到异常
2)proxy_http_version 1.1;
最后正确的yml配置
spring:
servlet:
multipart:
enabled: true #默认支持文件上传
max-file-size: 100mb
max-request-size: 100mb
resolve-lazily: true #设置为懒加载,不然依然会捕获不到异常
正确的nginx的配置
location / {
proxy_pass http://xxxx:9090/;
proxy_http_version 1.1;
proxy_read_timeout 6000s;
proxy_pass_header Server;
proxy_set_header X-Scheme $scheme;
proxy_redirect off;
# 真实的客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 请求头中Host信息
#proxy_set_header Host $host;
# 代理路由信息,此处取IP有安全隐患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真实的用户访问协议
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
add_header Cache-Control max-age=no-cache;
}
坑爹
nginx之前没加这行proxy_http_version 1.1; 后来加上这行就成功了,奥尼骂,巨坑记录一下
成功
该文章部分内容已隐藏
