如何在Java Web Tomcat 8运行时(NEO)上处理MaxUploadSizeExceededException?

2020-08-25 05:35发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我们在SAP Cloud Platform上托管了一个基于Spring的Java Web Tomcat 8应用程序。

我们已将最大上传大小配置为120 MB,并将最大内存中上传大小配置为120 MB,如以下代码段所示:

 @配置
 公共类CommonsMultipartResolverConfig {

     私有静态最终整数MAX_IN_MEMORY_UPLOAD = 120 * 1024 * 1024;
     私有静态最终整数MAX_UPLOAD_SIZE = 120 * 1024 * 1024;

     @豆
     @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
     @Lazy(真)
     公共CommonsMultipartResolver multipartResolver(){
         CommonsMultipartResolver commonsMultipartResolver =新的CommonsMultipartResolver();
         commonsMultipartResolver.setMaxUploadSize(MAX_UPLOAD_SIZE);
         commonsMultipartResolver.setMaxInMemorySize(MAX_IN_MEMORY_UPLOAD);
         返回commonsMultipartResolver;
     }}
 

当文件小于或等于120 MB阈值时,所有上载都可以正常工作。 当大小超过该大小时,在客户端,我们将得到以下响应:

错误报告

HTTP状态500-发生内部应用程序错误。 请求:3821930456 a3f704cbf:rsmwebui

在Java应用程序上,我们还为MaxUploadSizeExceededException设置了自定义处理:

 @ControllerAdvice
 公共类GeneralExceptionHandler扩展ResponseEntityExceptionHandler {

     @ExceptionHandler(MaxUploadSizeExceededException.class)
     公共ResponseEntity  handleMaxSizeException(MaxMaxloadSizeExceededException ex){
         long maxSizeInMB = ex.getMaxUploadSize()/1024/1024;
         ErrorResponse err = ErrorResponse.builder()。message("最大上传大小为" + maxSizeInMB +"已超出MB")。build();
         返回新的ResponseEntity <>(err,HttpStatus.PAYLOAD_TOO_LARGE);
     }
 }
 

尽管上面的代码被触发,但响应始终是上面的html。

从Java应用程序级别的http日志中,我们还注意到,当上传超出限制的文件时,将会记录多个http调用:

我已经读到这可能是由于Tomcat服务器由于其自己的连接器设置(maxPostSize,maxSwallowSize)而重置了连接。

请告知我们如何设法在客户端收到适当的自定义消息,该消息实际上会告知已超过限制。

谢谢!

(89.4 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我们在SAP Cloud Platform上托管了一个基于Spring的Java Web Tomcat 8应用程序。

我们已将最大上传大小配置为120 MB,并将最大内存中上传大小配置为120 MB,如以下代码段所示:

 @配置
 公共类CommonsMultipartResolverConfig {

     私有静态最终整数MAX_IN_MEMORY_UPLOAD = 120 * 1024 * 1024;
     私有静态最终整数MAX_UPLOAD_SIZE = 120 * 1024 * 1024;

     @豆
     @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
     @Lazy(真)
     公共CommonsMultipartResolver multipartResolver(){
         CommonsMultipartResolver commonsMultipartResolver =新的CommonsMultipartResolver();
         commonsMultipartResolver.setMaxUploadSize(MAX_UPLOAD_SIZE);
         commonsMultipartResolver.setMaxInMemorySize(MAX_IN_MEMORY_UPLOAD);
         返回commonsMultipartResolver;
     }}
 

当文件小于或等于120 MB阈值时,所有上载都可以正常工作。 当大小超过该大小时,在客户端,我们将得到以下响应:

错误报告

HTTP状态500-发生内部应用程序错误。 请求:3821930456 a3f704cbf:rsmwebui

在Java应用程序上,我们还为MaxUploadSizeExceededException设置了自定义处理:

 @ControllerAdvice
 公共类GeneralExceptionHandler扩展ResponseEntityExceptionHandler {

     @ExceptionHandler(MaxUploadSizeExceededException.class)
     公共ResponseEntity  handleMaxSizeException(MaxMaxloadSizeExceededException ex){
         long maxSizeInMB = ex.getMaxUploadSize()/1024/1024;
         ErrorResponse err = ErrorResponse.builder()。message("最大上传大小为" + maxSizeInMB +"已超出MB")。build();
         返回新的ResponseEntity <>(err,HttpStatus.PAYLOAD_TOO_LARGE);
     }
 }
 

尽管上面的代码被触发,但响应始终是上面的html。

从Java应用程序级别的http日志中,我们还注意到,当上传超出限制的文件时,将会记录多个http调用:

我已经读到这可能是由于Tomcat服务器由于其自己的连接器设置(maxPostSize,maxSwallowSize)而重置了连接。

请告知我们如何设法在客户端收到适当的自定义消息,该消息实际上会告知已超过限制。

谢谢!

(89.4 kB)
付费偷看设置
发送
2条回答
绿领巾童鞋
1楼-- · 2020-08-25 05:55

您好 Flaviu Pop

为了使用JavaBuildPack,请考虑特定的Tomcat配置 ,则有以下文件中所述的两个选项:

https://community.pivotal.io/s/article/How-to-Customize-Java-Build-packs-Tomcat-s-Server-xml

我并不是说这应该改变错误500的行为。但是值得一试。

最好的问候,
伊凡

N-Moskvin
2楼-- · 2020-08-25 05:56

您好, Flaviu Pop

很抱歉,我没有注意到您问题的标题。

对于Neo,我是 不知道有任何选项可以修改标准的tomcat配置。 可能不受支持,因为您只能在部署war文件时控制Java启动参数。

但是,可能可以通过Spring来配置tomcat服务器,如下所述:

< p> https://mkyong.com/spring-boot/spring-boot -configure-maxswallowsize-in-embedded-tomcat/

此致,
伊万

一周热门 更多>