因为struts2漏洞由Struts2升级为struts2.3.15.1后出现的问题

时间:2021-11-11 17:07:19
这个bug是由Struts2上传文件后return SUCCESS后报的错误:

java.lang.AbstractMethodError: be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp()V
at org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper.cleanUp(MultiPartRequestWrapper.java:271)
at org.apache.struts2.dispatcher.Dispatcher.cleanUpRequest(Dispatcher.java:837)
at org.apache.struts2.dispatcher.ng.PrepareOperations.cleanupRequest(PrepareOperations.java:103)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:103)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
各位大侠有没有解决方法。
可以了解一下struts2漏洞的严重性。
http://blog.csdn.net/huifeng773950918/article/details/9851015

13 个解决方案

#1


be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp你这个类是干嘛的,接口?

#2


是不是JAR包有冲突

#3


be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp你这个类是干嘛的,接口?这个是Struts2里面的接口,网上说这个是清除最后请求的一个接口来的。

#4


引用 1 楼 fangmingshijie 的回复:
be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp你这个类是干嘛的,接口?

这个是Struts2里面的接口,网上说这个是清除最后请求的一个接口来的。报这个错误是执行完所有代码后,return SUCCESS执行Struts2代码->struts.xml确定跳转页面的过程中报错。

#5


这个是Struts2的接口?这个看上去更像是第三方的文件上传解析类,你项目中应该是用了这个类替换了struts2默认的org.apache.struts2.multipart.JakartaMultiPartRequest这个文件上传的解析类
如果没什么必要不用去换它的

#6


引用 5 楼 suciver 的回复:
这个是Struts2的接口?这个看上去更像是第三方的文件上传解析类,你项目中应该是用了这个类替换了struts2默认的org.apache.struts2.multipart.JakartaMultiPartRequest这个文件上传的解析类
如果没什么必要不用去换它的
直接是利用dwr跟Strut2结合起来实现上传进度条的,struts.xml配置是
<constant name="struts.multipart.parser" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
<constant name="struts.multipart.handler" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
报上面的错误也就是这个引起的,或者有没有好的上传进度条可以介绍。

#7


因为struts2漏洞由Struts2升级为struts2.3.15.1后出现的问题学习了。。。。。。。。。。。。。。。

#8


引用 6 楼 huifeng773950918 的回复:
Quote: 引用 5 楼 suciver 的回复:

这个是Struts2的接口?这个看上去更像是第三方的文件上传解析类,你项目中应该是用了这个类替换了struts2默认的org.apache.struts2.multipart.JakartaMultiPartRequest这个文件上传的解析类
如果没什么必要不用去换它的
直接是利用dwr跟Strut2结合起来实现上传进度条的,struts.xml配置是
<constant name="struts.multipart.parser" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
<constant name="struts.multipart.handler" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
报上面的错误也就是这个引起的,或者有没有好的上传进度条可以介绍。

楼主要实现大文件上传的进度条没必要用什么dwr和第三方的。因为struts2文件上传的解析类中已经提供了文件进度监听器你只要自己写个类继承org.apache.struts2.multipart.JakartaMultiPartRequest;
把里面的源码复制到你的类中,只要针对parseRequest方法加入自己的监听器就行了,这里是源码里的parseRequest方法,前台可以用jquery的progressBar的进度条插件就可以了(插件很简单你google下就知道了)

private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
        DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
        ServletFileUpload upload = new ServletFileUpload(fac);
        upload.setSizeMax(maxSize);
/*把进度监听器放进去,文件上传的源码中每次上传的进度都会反映到这个监听器里面
在这里把进度放入session中*/
        upload.setProgressListener(new ProgressListener(){
/*第一个参数是当前总共读取的字节数,第二个参数是当前提交的内容总大小(这里就包括了整个表单的内容大小不仅是文件的大小),第三个参数是当前已经多了几次了*/
          public void upload(long readBytes,long contentLength,int item){
            HttpSession session=ServletActionContext.getRequest().getSession();
/*把当前总共读取到的字节数以及总大小都放入session中,前台就可以用ajax每0.5秒从session中取出进度*/
            session.setAttribute("currentProgress",readBytes);
            session.setAttribute("contentLength",contentLength);
          }
        });
        return upload.parseRequest(createRequestContext(servletRequest));
    }

前端你用ajax每0.5或1秒去另一个action中取session中的currentProgress就行了,我以前用的是jquery的progressBar进度条插件把取到的当前进度和总大小设置进去进度条插件就能不断显示进度了

#9


是不是JAR包有冲突

#10


引用 8 楼 suciver 的回复:
Quote: 引用 6 楼 huifeng773950918 的回复:

Quote: 引用 5 楼 suciver 的回复:

这个是Struts2的接口?这个看上去更像是第三方的文件上传解析类,你项目中应该是用了这个类替换了struts2默认的org.apache.struts2.multipart.JakartaMultiPartRequest这个文件上传的解析类
如果没什么必要不用去换它的
直接是利用dwr跟Strut2结合起来实现上传进度条的,struts.xml配置是
<constant name="struts.multipart.parser" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
<constant name="struts.multipart.handler" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
报上面的错误也就是这个引起的,或者有没有好的上传进度条可以介绍。

楼主要实现大文件上传的进度条没必要用什么dwr和第三方的。因为struts2文件上传的解析类中已经提供了文件进度监听器你只要自己写个类继承org.apache.struts2.multipart.JakartaMultiPartRequest;
把里面的源码复制到你的类中,只要针对parseRequest方法加入自己的监听器就行了,这里是源码里的parseRequest方法,前台可以用jquery的progressBar的进度条插件就可以了(插件很简单你google下就知道了)

private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
        DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
        ServletFileUpload upload = new ServletFileUpload(fac);
        upload.setSizeMax(maxSize);
/*把进度监听器放进去,文件上传的源码中每次上传的进度都会反映到这个监听器里面
在这里把进度放入session中*/
        upload.setProgressListener(new ProgressListener(){
/*第一个参数是当前总共读取的字节数,第二个参数是当前提交的内容总大小(这里就包括了整个表单的内容大小不仅是文件的大小),第三个参数是当前已经多了几次了*/
          public void upload(long readBytes,long contentLength,int item){
            HttpSession session=ServletActionContext.getRequest().getSession();
/*把当前总共读取到的字节数以及总大小都放入session中,前台就可以用ajax每0.5秒从session中取出进度*/
            session.setAttribute("currentProgress",readBytes);
            session.setAttribute("contentLength",contentLength);
          }
        });
        return upload.parseRequest(createRequestContext(servletRequest));
    }

前端你用ajax每0.5或1秒去另一个action中取session中的currentProgress就行了,我以前用的是jquery的progressBar进度条插件把取到的当前进度和总大小设置进去进度条插件就能不断显示进度了




我自己写了一个UploadUtil实现类,继承了JakartaMultiPartRequest这个类。自己实现的UploadUtil怎样才能起到监听作用??

#11


藐视可以了。。。。

#12


这个问题怎么解决呢?楼主,请赐教!

#13


大神怎么解决的?我这里怎么无法解决?

#1


be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp你这个类是干嘛的,接口?

#2


是不是JAR包有冲突

#3


be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp你这个类是干嘛的,接口?这个是Struts2里面的接口,网上说这个是清除最后请求的一个接口来的。

#4


引用 1 楼 fangmingshijie 的回复:
be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp你这个类是干嘛的,接口?

这个是Struts2里面的接口,网上说这个是清除最后请求的一个接口来的。报这个错误是执行完所有代码后,return SUCCESS执行Struts2代码->struts.xml确定跳转页面的过程中报错。

#5


这个是Struts2的接口?这个看上去更像是第三方的文件上传解析类,你项目中应该是用了这个类替换了struts2默认的org.apache.struts2.multipart.JakartaMultiPartRequest这个文件上传的解析类
如果没什么必要不用去换它的

#6


引用 5 楼 suciver 的回复:
这个是Struts2的接口?这个看上去更像是第三方的文件上传解析类,你项目中应该是用了这个类替换了struts2默认的org.apache.struts2.multipart.JakartaMultiPartRequest这个文件上传的解析类
如果没什么必要不用去换它的
直接是利用dwr跟Strut2结合起来实现上传进度条的,struts.xml配置是
<constant name="struts.multipart.parser" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
<constant name="struts.multipart.handler" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
报上面的错误也就是这个引起的,或者有没有好的上传进度条可以介绍。

#7


因为struts2漏洞由Struts2升级为struts2.3.15.1后出现的问题学习了。。。。。。。。。。。。。。。

#8


引用 6 楼 huifeng773950918 的回复:
Quote: 引用 5 楼 suciver 的回复:

这个是Struts2的接口?这个看上去更像是第三方的文件上传解析类,你项目中应该是用了这个类替换了struts2默认的org.apache.struts2.multipart.JakartaMultiPartRequest这个文件上传的解析类
如果没什么必要不用去换它的
直接是利用dwr跟Strut2结合起来实现上传进度条的,struts.xml配置是
<constant name="struts.multipart.parser" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
<constant name="struts.multipart.handler" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
报上面的错误也就是这个引起的,或者有没有好的上传进度条可以介绍。

楼主要实现大文件上传的进度条没必要用什么dwr和第三方的。因为struts2文件上传的解析类中已经提供了文件进度监听器你只要自己写个类继承org.apache.struts2.multipart.JakartaMultiPartRequest;
把里面的源码复制到你的类中,只要针对parseRequest方法加入自己的监听器就行了,这里是源码里的parseRequest方法,前台可以用jquery的progressBar的进度条插件就可以了(插件很简单你google下就知道了)

private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
        DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
        ServletFileUpload upload = new ServletFileUpload(fac);
        upload.setSizeMax(maxSize);
/*把进度监听器放进去,文件上传的源码中每次上传的进度都会反映到这个监听器里面
在这里把进度放入session中*/
        upload.setProgressListener(new ProgressListener(){
/*第一个参数是当前总共读取的字节数,第二个参数是当前提交的内容总大小(这里就包括了整个表单的内容大小不仅是文件的大小),第三个参数是当前已经多了几次了*/
          public void upload(long readBytes,long contentLength,int item){
            HttpSession session=ServletActionContext.getRequest().getSession();
/*把当前总共读取到的字节数以及总大小都放入session中,前台就可以用ajax每0.5秒从session中取出进度*/
            session.setAttribute("currentProgress",readBytes);
            session.setAttribute("contentLength",contentLength);
          }
        });
        return upload.parseRequest(createRequestContext(servletRequest));
    }

前端你用ajax每0.5或1秒去另一个action中取session中的currentProgress就行了,我以前用的是jquery的progressBar进度条插件把取到的当前进度和总大小设置进去进度条插件就能不断显示进度了

#9


是不是JAR包有冲突

#10


引用 8 楼 suciver 的回复:
Quote: 引用 6 楼 huifeng773950918 的回复:

Quote: 引用 5 楼 suciver 的回复:

这个是Struts2的接口?这个看上去更像是第三方的文件上传解析类,你项目中应该是用了这个类替换了struts2默认的org.apache.struts2.multipart.JakartaMultiPartRequest这个文件上传的解析类
如果没什么必要不用去换它的
直接是利用dwr跟Strut2结合起来实现上传进度条的,struts.xml配置是
<constant name="struts.multipart.parser" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
<constant name="struts.multipart.handler" value="be.telio.mediastore.ui.upload.GarryMultiPartRequest" />
报上面的错误也就是这个引起的,或者有没有好的上传进度条可以介绍。

楼主要实现大文件上传的进度条没必要用什么dwr和第三方的。因为struts2文件上传的解析类中已经提供了文件进度监听器你只要自己写个类继承org.apache.struts2.multipart.JakartaMultiPartRequest;
把里面的源码复制到你的类中,只要针对parseRequest方法加入自己的监听器就行了,这里是源码里的parseRequest方法,前台可以用jquery的progressBar的进度条插件就可以了(插件很简单你google下就知道了)

private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
        DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
        ServletFileUpload upload = new ServletFileUpload(fac);
        upload.setSizeMax(maxSize);
/*把进度监听器放进去,文件上传的源码中每次上传的进度都会反映到这个监听器里面
在这里把进度放入session中*/
        upload.setProgressListener(new ProgressListener(){
/*第一个参数是当前总共读取的字节数,第二个参数是当前提交的内容总大小(这里就包括了整个表单的内容大小不仅是文件的大小),第三个参数是当前已经多了几次了*/
          public void upload(long readBytes,long contentLength,int item){
            HttpSession session=ServletActionContext.getRequest().getSession();
/*把当前总共读取到的字节数以及总大小都放入session中,前台就可以用ajax每0.5秒从session中取出进度*/
            session.setAttribute("currentProgress",readBytes);
            session.setAttribute("contentLength",contentLength);
          }
        });
        return upload.parseRequest(createRequestContext(servletRequest));
    }

前端你用ajax每0.5或1秒去另一个action中取session中的currentProgress就行了,我以前用的是jquery的progressBar进度条插件把取到的当前进度和总大小设置进去进度条插件就能不断显示进度了




我自己写了一个UploadUtil实现类,继承了JakartaMultiPartRequest这个类。自己实现的UploadUtil怎样才能起到监听作用??

#11


藐视可以了。。。。

#12


这个问题怎么解决呢?楼主,请赐教!

#13


大神怎么解决的?我这里怎么无法解决?