`
wanxiaotao12
  • 浏览: 473722 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]浅谈对struts2.2 the request was rejected because its size (XXXX) exceeds the con

 
阅读更多

最近在学struts2 ,在上传文件时发现有个异常不好处理,经过google终于有点小眉目,现浅谈下这个异常处理。有不妥当的地方还请指教

 http://blog.csdn.net/dxswzj

 

  在struts2中我们上传文件大于struts.multipart.maxSize设置的值时会抛出the request was rejected because its size (XXXX) exceeds the configured maximum (XXXX)异常,他是不能被国际化的,这信息对应用户来说是非常不友好的,那任何处理?

 

在struts2.2 中有两个地方设置上传文件大小:

   一个是在拦截器fileUpload中设置

 

  1. <interceptor-ref name="fileUpload">  
  2.   <param name="maximumSize">1000000</param>  
  3. </interceptor-ref>    

 

   一个是在struts2 自带的文件default.properties中设置的(系统默认大小2M)

   struts.multipart.maxSize=2097152

   这个可以在struts.propertise 文件中修改

 

那这两个有什么区别呢?

   Struts2框架底层默认用的是apache的commons-fileupload组件对上传文件进行接受处理。struts.multipart.maxSize设置的大小就是该处理时取用的值,在上传文件之前系统会去比较文件的大小是否超过了该值,如果超过将抛出上述异常,commons-fileupload组件是不支持国际化的,所以我们看到的异常都是默认的。

   fileUpload拦截器只是当文件上传到服务器上之后,才进行的文件类型和大小判断。 如果上传的文件大小刚好这 struts.multipart.maxSize与maximumSize 之间会抛出 key  struts.messages.error.file.too.large 对应的异常信息,这个才支持国际化。那不是把struts.multipart.maxSize设很大,不就解决问题了吗?非也! fileUpload拦截器只是当文件上传到服务器上之后,才进行的文件类型和大小判断,这样会造成系统产生多余没用的文件。

 

那该如何是好?

   其实解决的办法有多种,我这里介绍种最简单的方法:
   在struts2.2 org.apache.commons.fileupload.FileUploadBase.java 中我们看到

 

  1. /** 
  2.  * Creates a new instance. 
  3.  * @param ctx The request context. 
  4.  * @throws FileUploadException An error occurred while 
  5.  *   parsing the request. 
  6.  * @throws IOException An I/O error occurred. 
  7.  */  
  8. FileItemIteratorImpl(RequestContext ctx)  
  9.         throws FileUploadException, IOException {  
  10.     if (ctx == null) {  
  11.         throw new NullPointerException("ctx parameter");  
  12.     }  
  13.   
  14.     String contentType = ctx.getContentType();  
  15.     if ((null == contentType)  
  16.             || (!contentType.toLowerCase().startsWith(MULTIPART))) {  
  17.         throw new InvalidContentTypeException(  
  18.                 "the request doesn't contain a "  
  19.                 + MULTIPART_FORM_DATA  
  20.                 + " or "  
  21.                 + MULTIPART_MIXED  
  22.                 + " stream, content type header is "  
  23.                 + contentType);  
  24.     }  
  25.   
  26.     InputStream input = ctx.getInputStream();  
  27.   
  28.     if (sizeMax >= 0) {  
  29.         int requestSize = ctx.getContentLength();  
  30.         if (requestSize == -1) {  
  31.             input = new LimitedInputStream(input, sizeMax) {  
  32.                 protected void raiseError(long pSizeMax, long pCount)  
  33.                         throws IOException {  
  34.                     FileUploadException ex =  
  35.                         new SizeLimitExceededException(  
  36.                             "the request was rejected because"  
  37.                             + " its size (" + pCount  
  38.                             + ") exceeds the configured maximum"  
  39.                             + " (" + pSizeMax + ")",  
  40.                             pCount, pSizeMax);  
  41.                     throw new FileUploadIOException(ex);  
  42.                 }  
  43.             };  
  44.         } else {  
  45. ///问题就在这里////////////////////////////////////  
  46.             if (sizeMax >= 0 && requestSize > sizeMax) {  
  47.                 throw new SizeLimitExceededException(  
  48.                         "the request was rejected because its size ("  
  49.                         + requestSize  
  50.                         + ") exceeds the configured maximum ("  
  51.                         + sizeMax + ")",  
  52.                         requestSize, sizeMax);  
  53.             }  
  54.         }  
  55.     }  
  56.   
  57.     String charEncoding = headerEncoding;  
  58.     if (charEncoding == null) {  
  59.         charEncoding = ctx.getCharacterEncoding();  
  60.     }  
  61.   
  62.     boundary = getBoundary(contentType);  
  63.     if (boundary == null) {  
  64.         throw new FileUploadException(  
  65.                 "the request was rejected because "  
  66.                 + "no multipart boundary was found");  
  67.     }  
  68.   
  69.     notifier = new MultipartStream.ProgressNotifier(listener,  
  70.             ctx.getContentLength());  
  71.     multi = new MultipartStream(input, boundary, notifier);  
  72.     multi.setHeaderEncoding(charEncoding);  
  73.   
  74.     skipPreamble = true;  
  75.     findNextItem();  
  76. }  

 

实际上他是把该异常信息设置为Action级别的错误信息。

了解完这个就好办了,我们可以在action中直接重写ActionSupport的addActionError()方法,

 

 

  1. /**   
  2.  
  3. * 替换文件上传中出现的错误信息  
  4. *引用 import java.util.regex.Matcher; 
  5. *    import java.util.regex.Pattern; 
  6.  
  7. * */   
  8.   
  9. @Override   
  10.   
  11. public void addActionError(String anErrorMessage) {    
  12.   
  13. //这里要先判断一下,是我们要替换的错误,才处理    
  14.   
  15.    if (anErrorMessage.startsWith("the request was rejected because its size")) {    
  16.   
  17.      Matcher m = Pattern.compile("//d+").matcher(anErrorMessage);    
  18.   
  19.     String s1 = "";    
  20.   
  21.     if (m.find())   s1 = m.group();    
  22.   
  23.     String s2 = "";    
  24.   
  25.     if (m.find())   s2 = m.group();    
  26.   
  27.     //偷梁换柱,将信息替换掉    
  28.      super.addActionError("你上传的文件大小(" + s1 + ")超过允许的大小(" + s2 + ")");    
  29.     //也可以改为在Field级别的错误  
  30.     // super.addFieldError("file","你上传的文件大小(" + s1 + ")超过允许的大小(" + s2 + ")");    
  31.   
  32.   } else {//否则按原来的方法处理   
  33.   
  34.      super.addActionError(anErrorMessage);    
  35. }    
  36.   
  37. }   

 

 

这时这页面增加

 

  1. <s:fielderror/>  

 

就可以了。

 

做到这里还有个问题,就是原来页面上输入的其他文本内容也都不见了,也就是说params注入失败。

这个是没办法的,因为这个异常是在文件上传之前捕获的,文件未上传,同时params也为注入,所以这时最好重定向到一个jsp文件,提示上传失败,然后重写填写相应信息。

分享到:
评论

相关推荐

    Struts2多文件上传与邮件附件发送

    the request was rejected because its size (16272982) exceeds the configured maximum (9000000) 2.fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。 struts.multipart.maxSize默认2M...

    Git-2.37.1版本 windows64位

    Git-2.37.1,windows64位用。好用的版本。

    struts2 上传文件超过最大值解决办法

    if (anErrorMessage.startsWith("the request was rejected because its size")) { Matcher m = Pattern.compile("\\d+").matcher(anErrorMessage); String s1 = ""; if (m.find()) { s1 = m.group(); } ...

    上传war文件大小超过Tomcat7最大文件限制报错

    org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException:the request was rejected because its size (66704562) exceeds the configured maximum (52428800) ``` 此问题的发生是由于...

    idea上传代码到github时遇到的Push rejected: Push to origin/master was rejected

    在使用IntelliJ IDEA(简称Idea)上传代码到GitHub时,可能会遇到“Push rejected: Push to origin/master was rejected”的错误。这个问题通常发生在你尝试将一个新的项目推送到一个已存在文件的GitHub仓库时。以下...

    a project model for the FreeBSD Project.7z

    The vision is “To produce the best UNIX-like operating system package possible, with due respect to the original software tools ideology as well as usability, performance and stability.” The ...

    Senfore_DragDrop_v4.1

    version of Delphi and C++ Builder has its own package; DragDropD6.dpk for Delphi 6, DragDropD5.dpk for Delphi 5, DragDropC5.bpk for C++ Builder 5, etc. 4) Add the Drag and Drop Component Suite ...

    Domain-Driven+Design+in+PHP-Packt+Publishing(2017).pdf

    The training was fantastic, and all the concepts that were swirling around in their minds prior to the trip suddenly became very real. However, they were the only two ...

    weblogic 8.X 无限制

    The Server is not licensed for this operation.Connection rejected, the server license allows connections from only 5 unique IP addresses. 没有授权 提示5个IP访问的限制 解决办法: 从licensecodes.oracle...

    大学英语四级历年真题及答案详解(2000年——2010年)

    4. A) The woman rejected the man's apology.  B) The woman appreciated the man's offer.  C) The man had forgotten the whole thing. D) The man had hurt the woman's feelings. 5. A) The woman is ...

    word自动转化为chm

    Q: Error while loading Word document: “Call was rejected by callee”, “Command failed”, “The RPC server is unavailable”, etc. A: Connection to Microsoft Word may be blocked by the anti-virus ...

    Decompiling Android.pdf

    The following is a detailed exploration of the key concepts covered in the document, including the history and significance of decompilers, the vulnerabilities of virtual machines, and strategies for...

    大学英语精读2课后翻译题答案解析.doc

    3. "He is very likely to be rejected because of his bad eyesight." 这句话展示了条件句的表达,"be likely to do"(可能做某事)和原因状语。 4. "The committee members have conflicting opinions as to the ...

    大学英语精读第二册课后翻译.doc

    3. "It is very likely that he will be rejected by the army because of his bad eyesight." "It is likely that..."的句型用于表达可能性,"because of"引导原因。 4. "The mittee members have conflicting ...

    SmsRejectedReceiver.rar_Rejected

    通过监听`Intent.SMS_REJECTED`,它可以提供一种方式来对短信发送失败的情况做出反应,从而增强应用的功能性和用户体验。在实际应用中,我们可以根据需求定制具体的响应行为,比如提醒用户重新发送短信或提供其他...

    dengfeng520#xiaoshiguangBlog#Vue笔记1

    1、依赖工具去官网下载node2、安装和构建如果报The operation was rejected by your operating system.使用安

    考研英语高频词

    例如:The absurd idea was rejected by the committee.(荒谬的想法被委员会否决了。) 3. abundant 丰富的 abundant是一个非常重要的词汇,它可以用来形容一些丰富或充足的情况。例如:The abundant rainfall ...

Global site tag (gtag.js) - Google Analytics