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