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>
原文地址:https://www.cnblogs.com/liberty777/p/10214468.html