Struts2版本升級到struts2 2.3.15.1操做說明

Struts2的官網公佈了一個遠程命令執行漏洞,官方強烈建議升級到2.3.15.1或者以上版本,該版本包含校訂過的struts2核心庫。html

咱們以前開發項目主要採用的Struts2版本是2.2.1,本文介紹下Struts2從2.2.1升級到2.3.15.1的過程。前端

首先自Struts官方網站下載struts-2.3.15.1-all.zip,裏面包含所須要的jar。java

刪除項目中以下jar文件:web

 

將struts-2.3.15.1-all.zip中的以下jar文件加到項目中:express

 

升級jar以後,測試項目,發現2個問題,第一個問題,控制檯會常常輸出以下信息:apache

*********************************************************************** 
*                               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            * 
*                                                                     * 
***********************************************************************app

意思是說ActionContextCleanUp過時,不建議使用,查看了測試

http://struts.apache.org/2.x/docs/webxml.html,沒有看出因此然,後來在論壇中有人說Struts的過濾器org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter包含了ActionContextCleanUp功能,因此註釋掉web.XML文件中的ActionContextCleanUp過濾器便可。網站

注意若是struts2過濾器不是this

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’>不要寫。

 

最後總結下升級過程:

一、      替換jar

二、      註釋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>

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

相關文章
相關標籤/搜索