struts2.3.16.3升级遇到无法动态访问action的方法的问题。

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官网一看。唉,果然如此。看来,之前我不关心升级版本的新功能真是罪孽!导致浪费了这么多的时间,以后这方面要改进。struts官方说明的链接如下:

http://struts.apache.org/release/2.3.x/docs/version-notes-23152.html

问题清楚了解决起来就容易了,在我们项目的struts.xml配置文件中加入以下配置:
       

2、这次引入了struts的零配置,但是发现一个问题就是这个零配置的ActionSupport或者是有execute方法才能被零配置组件识别,这是怎么回事?

              经过调试发现在PackageBasedActionConfigBuilder类的buildConfiguration方法中要根据mapAllMatches来判断,如果这个属性是true则能被struts插件识别,否则就必须要继承ActionSupport,或者必须使用零配置的Action注解,否则就不会被识别。那么这个变量又是如何来的呢?经过追代码发现这个是通过当前类的setMapAllMatches方法注入的,这个变量在convention组件的sturts-plugin.xml文件中配置了,而且默认值是false。

              问题清楚了,解决办法就是在struts.xml的配置文件中配置即可解决。

你可能感兴趣的:(Struts)