Struts2.5的DMI与新增的SMI

Posted LiberStone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

 


以上是关于Struts2.5的DMI与新增的SMI的主要内容,如果未能解决你的问题,请参考以下文章

关于Struts2中DMI(动态调用)错误问题

J2EEStruts2.5.10 无法进入Action类的指定方法

错误:NVIDIA-SMI 失败,因为它无法与 NVIDIA 驱动程序通信

nvidia-smi 命令可以与 nvidia 驱动程序 microsoft azure dsvm 通信

KubeEdge:下一代云原生边缘设备管理标准DMI的设计与实现

struts2.5+框架使用通配符与动态方法