Struts2.5的DMI与新增的SMI
1问题
解决:在使用Struts2.5之后的版本,在DMI(动态方法调用)上,通配符无法正常使用
2原因
在使用Struts2.5之后的版本,在DMI(动态方法调用)上,在DMI使用时,是默认被禁用的,默认开启SMI模式,导致通配符*无法正常使用
Apache Struts项目的官方解释如下:
从Struts2.3开始,我们增加了一个开关来控制DMI,我们这样做基于两个原因:
1. 如果Action的实现是纯POJO方式(既不继承自ActionSupport也不实现Action接口),这种场景下使用DMI可能导致安全问题。
2. DMI功能跟使用通配符配置Action类的方法有重叠的地方,而通配符配置的方式早在Struts1就有了。
注:DMI(Dynamic Method Invocation)SMI(Strict Method Invocation)
3解决
方式一:暴力关闭
可以将该包的strict-method-invocation="false"设置为false
1 <package name="my" extends="struts-default" namespace="/my" strict-method-invocation="false">
2 <action name="stu_*" class="com.czd.action.tryAction" method="{1}">
3 <result name="a">/page/loginok.jsp</result>
4 <result name="b">/page/loginok.jsp</result>
5 <result name="c">/page/loginok.jsp</result>
6 <result name="d">/page/loginok.jsp</result>
7 </action>
8 </package>
方式二:添加可用
在package包中添加<global-allowed-methods>regex:.*</global-allowed-methods>
1 <package name="my" extends="struts-default" namespace="/my" >
2 <global-allowed-methods>regex:.*</global-allowed-methods>
3 <action name="stu_*" class="com.czd.action.tryAction" method="{1}">
4 <result name="a">/page/loginok.jsp</result>
5 <result name="b">/page/loginok.jsp</result>
6 <result name="c">/page/loginok.jsp</result>
7 <result name="d">/page/loginok.jsp</result>
8 </action>
9 </package>
或者<allowed-methods>add,del,...</allowed-methods>
1 <struts>
2 <constant name="struts.enable.DynamicMethodInvocation" value="true" />
3 <package name="mypack" extends="struts-default">
4 <action name="info*" class="com.stone.struts2.action.MyFirstAction" method="{1}">
5 <result>/{1}info.jsp</result>
6 <allowed-methods>add,del</allowed-methods>
7 </action>
8 </package>
9 </struts>