1. 程式人生 > >struts2.5.16新版本升級

struts2.5.16新版本升級

這次struts2版本升級,也是因為要修復安全漏洞CVE-2018-1327。在舊版本升級新版本的過程中,遇到了不少問題,在這裡記錄一下。

struts2.5.16版本下載連結:http://mirrors.hust.edu.cn/apache/struts/2.5.16/struts-2.5.16-all.zip

jackson-dataformat-xml-2.1.2.jar下載連結:http://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/2.1.2/jackson-dataformat-xml-2.1.2.jar

1.架包替換

struts2升級到2.5.16版本,大概需要替換更新的架包如下:

struts2-core-2.5.16.jar、struts2-json-plugin-2.5.16.jar、log4j-api-2.10.0.jar、xstream-1.4.10.jar、commons-io-2.5.jar、commons-lang3-3.6.jar

commons-fileupload-1.3.3.jar、freemarker-2.3.26-incubating.jar、javassist-3.20.0-GA.jar、jackson-annotations-2.9.0.jar、jackson-core-2.9.4.jar

jackson-databind-2.9.4.jar、jackson-dataformat-xml-2.1.2.jar、struts2-rest-plugin-2.5.16.jar

刪掉xwork-core-2.3.28.1.jar

其他jar請根據自己的工程補充。

2.新的類StrutsPrepareAndExecuteFilter

在原來的web.xml中,我們指定了filterstruts2的處理類,這個類在新的架包中,路徑發生了變化:

舊:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

新:org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

所以需要更新web.xml

3.index方法找不到

在老版本struts中,action如果不寫方法名稱,或者請求不指定特定的方法,struts就會預設呼叫execute方法。但是在新版本中,rest架包的RestActionMapper指定了預設的方法是index。就會出現錯誤

get方法報錯Wrong method was defined as an action method:index

post方法報錯Wrong method was defined as an action method:create


這個錯誤可在struts.properties中新增兩個配置項解決

struts.mapper.indexMethodName=execute

struts.mapper.postMethodName=execute


4.方法不被允許

如果url中帶有方法名,如index.action!getList,在struts2.5.16中,會報錯誤Method xxx for action xxx is not allowed!


需要在struts.xml中,設定所有方法都被允許


global-allowed-methods在package中的位置必須是在所有action之前,在所有其他global之後,不然就會報錯

需要注意的是global-allowed-methods這個屬性只在同一個package中起作用

5.新的action對映關係

在struts2.5.16中,struts2會讀取namespace並做匹配。

如果你的url是多層的,如:/aaa/bbb

在老版本的struts中可能不需要定義action”bbb”的namespace就可以正常使用

但是在新版本中,如果你的action沒有定義namespace,action定義成"bbb",struts2會將aaa當做action去做匹配,找不到就報錯誤,但是又不提示你是哪個action。

所以需要加上一個namespace=“/aaa”。

6.json型別資料處理

如果使用了rest架包,可能會導致json資料異常。

在rest架包中,預設json資料是由JacksonLibHandler類(struts2-rest-plugin-2.5.16.jar)處理的

而不使用rest的架包的時候,json資料,是由JSONResult類(struts2-json-plugin-2.3.28.1.jar)處理的。

JSONResult會自動從ACTION類中取出變數構造成json資料

這個變數是sturts自動選取的,選取判斷依據暫時沒有弄清楚,

或許我們可以通過在<result type="json"><paramname="root">變數名</param></result>進行人為指定,

這個可以試一下看是否生效。)

為了在rest中讓json資料重新由JSONResult處理,我們需要將json型別的處理類手動指定為HtmlHandler。

我們需要修改兩個檔案

struts.xml 增加一個bean=“myJson”的配置,class指定為org.apache.struts2.rest.handler.HtmlHandler


struts.properties 配置struts.rest.handlerOverride.json=myJson,struts.rest.content.restrictToGET=false

7.action配置中的method屬性沒有用

在action中指定了呼叫的method,但是實際上呼叫的還是index或者execute。

在com.opensymphony.xwork2.DefaultActionProxy中找到程式碼

可以看出,當method不為空的的時候,不會將action中配置的method傳遞過來

所以,而從url中生成的這個method,又是預設生成的,所以,我們需要將預設的method設定為空

8.標籤屬性更新

在struts2.5版本中,iterator標籤屬性id,set標籤屬性var、name,append標籤屬性id等都被移除。

但是因為程式已經發布出去,要修改我們自己的jsp,涉及的改動比較大,最好還是讓struts2相容一下舊版本。

所以,我們可以通過修改struts-tags.tld檔案來恢復支援相容。

要修改的檔案有兩個:

struts-core-2.5.16.jar/META-INF/struts-tags.tld

a)append新增一個name="id"的attribute

b)iterator新增一個name="id"的attribute

c)set新增一個name="id"的attribute,一個name="name"的attribute,set還要將name="var"的required修改為false

反編譯struts-core-2.5.16.jar中的org.apache.struts2.views.jsp.ContextBeanTag,增加方法setId