struts2.3.16.3升级遇到无法动态访问action的方法的问题。
2014-07-11 18:55
507 查看
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配置文件中加入以下配置:
<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"/>即可解决。
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配置文件中加入以下配置:
<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.3.16.3升级遇到无法动态访问action的方法的问题。
- struts2升级jar包遇到无法正常访问action的方法的问题
- 升级Struts2.5后使用DMI动态方法调用遇到问题
- 升级Struts2.5后使用DMI动态方法调用遇到问题
- Struts2.5动态方法调用action和使用通配符访问action
- 升级高版本的struts2.2.3.32 无法访问Action解决办法
- (action动态方法调用)struts通过ActionName!methodName.action,即通过感叹号(即!)访问某Action的方法,确老是报错
- Struts2 漏洞:Struts2.2.1版本紧急升级Struts2.3.15.1版本中遇到问题和解决方法,你中招了没?!
- struts升级到最高版本后遇到的问题。关于actionmessage传递问题。
- 关于struts2.5以后 遇到的几点改变以及动态调用方法问题
- struts2.1升级到2.3后动态调用方法问题
- 解决无法访问struts action的解决方法
- 远程连接出现“由于无法升级或重续本地计算机的客户端访问许可证,远程会话被中断。请跟服务器管理员联系。”问题的解决方法
- struts升级到最高版本后遇到的问题。关于actionmessage传递问题。
- struts2 动态访问Action方法NoSuchMethodException问题
- 以前很少遇到这样的问题。。。就是浏览器无法访问apache下的swf
- WIN7下.Net开发遇到的又一问题:HTTP 错误 500.19 - Internal Server Error,无法访问请求的页面,因为该页的相关配置数据无效。
- Fedora 12升级Chromium遇到的问题及解决方法
- Dropbox无法访问问题解决方法
- Samba 升级后软链接无法访问的问题解决方案