Struts2版本升级到struts2 2.3.15.1操作说明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2版本升级到struts2 2.3.15.1操作说明相关的知识,希望对你有一定的参考价值。

Struts2的官网公布了一个远程命令执行漏洞,官方强烈建议升级到2.3.15.1或者以上版本,该版本包含校正过的struts2核心库。

我们之前开发项目主要采用的Struts2版本是2.2.1,本文介绍下Struts2从2.2.1升级到2.3.15.1的过程。

首先自Struts官方网站下载struts-2.3.15.1-all.zip,里面包含所需要的jar。

删除项目中如下jar文件:

 技术分享

将struts-2.3.15.1-all.zip中的如下jar文件加到项目中:

 技术分享

技术分享

升级jar之后,测试项目,发现2个问题,第一个问题,控制台会经常输出如下信息:

*********************************************************************** 
*                               WARNING!!!                            * 
*                                                                     * 
* >>> ActionContextCleanUp<<< is deprecated! Please use the new filters! * 
*                                                                     * 
*           This can be a source of unpredictable problems!           * 
*                                                                     * 
*              Please refer to the docs for more details!             * 
*            http://struts.apache.org/2.x/docs/webxml.html            * 
*                                                                     * 
***********************************************************************

意思是说ActionContextCleanUp过期,不建议使用,查看了

http://struts.apache.org/2.x/docs/webxml.html,没有看出所以然,后来在论坛中有人说Struts的过滤器org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter包含了ActionContextCleanUp功能,所以注释掉web.XML文件中的ActionContextCleanUp过滤器即可。

注意如果struts2过滤器不是

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter的话,要修改成这个。

 

当然上述问题是个警告,如果说警告不予理睬的话,第二个问题是控制台抛出错误,这个就要解决了。

抛出错误的情况是:代码在执行某些数据保存的时候,会抛出异常,但是数据依然能保存,从前台功能上看没有任何问题。

 

后台异常堆栈信息:

16-04-01 02:33:49.017 ERROR [CommonsLogger.java:38]  Developer Notification (set struts.devMode to false to disable this message):

Unexpected Exception caught setting ‘formName‘ on ‘class net.jqsoft.XXXX.manager.XXXX.QuestionAnswer: Error setting expression ‘formName‘ with value [‘dataListForm‘, ]

Error setting expression ‘formName‘ with value [‘dataListForm‘, ] - [unknown location]

     at com.opensymphony.xwork2.ognl.OgnlValueStack.handleRuntimeException(OgnlValueStack.java:197)

     at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:174)

     at com.opensymphony.xwork2.ognl.OgnlValueStack.setParameter(OgnlValueStack.java:148)

     at com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:318)

     at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(Parameters

 

异常信息说的很清楚,只要关闭struts.devMode(开发模式)就不会抛出这些信息,尝试设置struts.devMode=false,果然不再抛出异常。

但是还是不放心,想知道到底为什么?参考论坛上的说法,Action中的所有属性都要加上seter、geter方法,检查下,都加上了,还是不行。

然后在action中添加private string formName,并生成seter、geter,测试发现抛出下面的问题:

Unexpected Exception caught setting ‘ showNum ‘ on .........

然后在action中添加private string showNum,并生成seter、geter,依次下去,最终问题解决。

总结下,原来Struts2.3.15.1检查的比较严格,凡在前端界面form中所有的name=’xxx’,action中都要有对应的属性,哪怕action端不需要使用这个name,也要加上。

搞明白了,可以放心的把struts.devMode=false,或者把代码写的严谨点,不需要的<input  name=’xxx’>不要写。

 

最后总结下升级过程:

1、      替换jar

2、      注释web.xml文件中的

<filter>

           <filter-name>struts2CleanUpFilter</filter-name>

           <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>

</filter>

<filter-mapping>

           <filter-name>struts2CleanUpFilter</filter-name>

           <url-pattern>/*</url-pattern>

</filter-mapping>

3、      修改struts.properties文件中的struts.devMode =  false

以上是关于Struts2版本升级到struts2 2.3.15.1操作说明的主要内容,如果未能解决你的问题,请参考以下文章

问候struts2升级的新版本2.5

Struts2升级 2.3.xx版本升级至2.3.37版本

Struts2-053漏洞

struts2升级至2.3.32,一定要对项目clean,clean,clean!!!

安全播报 | Apache Struts2 又双叒叕现高危漏洞(S2-052) 创宇盾无需升级即可防御

Struts2升级2.5.16,Tomcat运行正常部署Weblogic报错