struts2.3.16.3升级遇到无法动态访问action的方法的问题。
来源:互联网 发布:分销平台系统源码 编辑:程序博客网 时间:2024/05/22 04:38
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"/>即可解决。
- struts2.3.16.3升级遇到无法动态访问action的方法的问题。
- struts2.3.16.3升级遇到无法动态访问action的方法的问题。
- struts2升级jar包遇到无法正常访问action的方法的问题
- struts2 动态访问Action方法NoSuchMethodException问题
- 关于struts2.5.5action动态方法调用的问题
- 【3】Struts2的Action访问
- struts2如何访问action的特定方法
- Struts2—Action方法的访问
- struts2的Action方法无法进去
- struts2 中action的动态方法调用
- Struts2中Action的动态调用方法
- Struts2中Action的动态调用方法
- Struts2中Action的动态方法调用
- Struts2使用动态action(感叹号方式)遇到的问题及解决办法
- Struts2的动态调用Action方法和默认Action
- struts2.0升级到struts2.1.6遇到的问题汇总
- struts2动态方法调用,javascript动态修改表单的action
- struts2.3升级到struts2.5.10.1步骤及遇到的问题
- EXTjs 4 高效率编码风格
- SqlCommand之select、update
- android正则表达式总解
- NLP: 中文分词---正向匹配 (Forward Matching)
- cocos2dx不同分辨率下的自动适屏
- struts2.3.16.3升级遇到无法动态访问action的方法的问题。
- Java设计模式(九)责任链模式 命令模式
- ACM中不被AC的记录
- codechef July Challenge 2014
- 新的RSS reader
- cocos2d-x 文本读取CCFileUtils
- Objective C--访问者模式
- 大数运算模板
- 关于ESET NOD32 Antivirus 7 和 Google Drive ,Dropbox