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