struts2升级jar包遇到无法正常访问action的方法的问题
action name 取值為login!login.action 形式 而非login ?method name 為null
解決連接
http://blog.csdn.net/achilles12345/article/details/37697457
struts2安全漏洞頻發(fā),最近把這個升級了,但是發(fā)現(xiàn)了一些問題;
? ? ? ? 1、以前的url不能訪問了,比如“user!list.do”,其中user是配置在action中的action名稱,list是action中的方法。
? ? ? ? ? ? ? ?分析:
第一步:調(diào)試程序發(fā)現(xiàn)獲取的ActionMapper變量中,name變成了user!list, method屬性變成了null,很顯然正確情況下name應(yīng)該是user,method應(yīng)該是list。跟進(jìn)到DefaultActionMapper中時發(fā)現(xiàn)parseNameAndNamespace這個方法截取字符串是錯誤的,第一個直覺告訴我struts的開發(fā)者沒有這么愚蠢,是不是后邊又進(jìn)行了修正了呢?
第二步:繼續(xù)跟進(jìn)代碼發(fā)現(xiàn)在parseNameAndNamespace這個方法后邊的parseActionName方法里又進(jìn)行了一次處理,這個時候會把name屬性從“!”進(jìn)行分割重新獲
? ? ? ? ? ? ? ? ?取到name和method方法,很顯然這樣就對了。但是這個操作必須要根據(jù)DefaultActionMapper的成員變量allowDynamicMethodCalls屬性來區(qū)別,當(dāng)這個屬性為true
? ? ? ? ? ? ?的時候,才能執(zhí)行后邊的代碼。那么這個屬性又是在什么時候被設(shè)置的呢?
? ? ? ? ? ? ? ? 第三步:一看DefaultActionMapper源碼的構(gòu)造函數(shù),其中沒有這個變量,然后我就想是不是set方法設(shè)置進(jìn)來的,一看源碼如下:
? ? ? ? ? ? ? ? @Inject(StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION)
? ? ? ? ? ? ? ? public void setAllowDynamicMethodCalls(String allow) {
? ? ? ? ? ? ? ? ? ? ? allowDynamicMethodCalls = "true".equesIgnoreCase(allow);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?很顯然是被注入進(jìn)來的。
? ? ? ? ? ? ? ?第四步:剩余的過程也是跟進(jìn),可以省略了,最終這些變量是從struts-core-2.3.16.3.jar下的default.properties里來。和舊的版本一比較,果然struts.enable.DynamicMethodInvocation在2.3.15版本里設(shè)置的是true,而在2.3.16.3里是設(shè)置為false的。
? ? ? ?我就用“struts.enable.DynamicMethodInvocation”這個關(guān)鍵字上網(wǎng)一搜,果然是struts小組的人修改了這個屬性,把默認(rèn)修改為打開。然后我有上struts官網(wǎng)一看。唉,果然如此。看來,之前我不關(guān)心升級版本的新功能真是罪孽!導(dǎo)致浪費了這么多的時間,以后這方面要改進(jìn)。struts官方說明的鏈接如下:
http://struts.apache.org/release/2.3.x/docs/version-notes-23152.html
問題清楚了解決起來就容易了,在我們項目的struts.xml配置文件中加入以下配置:
? ? ? ? <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
2、這次引入了struts的零配置,但是發(fā)現(xiàn)一個問題就是這個零配置的ActionSupport或者是有execute方法才能被零配置組件識別,這是怎么回事?
? ? ? ? ? ? ? 經(jīng)過調(diào)試發(fā)現(xiàn)在PackageBasedActionConfigBuilder類的buildConfiguration方法中要根據(jù)mapAllMatches來判斷,如果這個屬性是true則能被struts插件識別,否則就必須要繼承ActionSupport,或者必須使用零配置的Action注解,否則就不會被識別。那么這個變量又是如何來的呢?經(jīng)過追代碼發(fā)現(xiàn)這個是通過當(dāng)前類的setMapAllMatches方法注入的,這個變量在convention組件的sturts-plugin.xml文件中配置了,而且默認(rèn)值是false。
? ? ? ? ? ? ? 問題清楚了,解決辦法就是在struts.xml的配置文件中配置<constant name="struts.convention.action.mapallmatches" value="true"/>即可解決。
總結(jié)
以上是生活随笔為你收集整理的struts2升级jar包遇到无法正常访问action的方法的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】图片分类CNN模板
- 下一篇: 【NLP】简单学习一下NLP中的tran