我在我的应用程序struts.xml
中有以下操作映射,它与Struts 2.3.28.1一起工作得很好;调用由/editApplication
方法处理的x.ApplicationHandler.edit
操作。
<action name="*Application" class="x.ApplicationHandler" method="{1}">
<result name="input">/WEB-INF/application.jsp</result>
<result name="success" type="redirectAction">
<param name="actionName">browseApps</param>
</result>
</action>
升级到Struts 2.5后,这不再有效。尝试调用/editApplication
操作会显示404错误:
HTTP状态404 - 没有针对命名空间[/]和操作名称[editApplication]
映射的操作
我已经查看了Struts 2.5发行说明,并且没有看到任何关于基于通配符的动作映射工作方式的更新。是否有任何理由说明此配置不再有效?
答案 0 :(得分:17)
它是Strict Method Invocation,因为Struts 2.5默认启用它。
关于SMI和通配符映射的文档:
在动作中使用通配符映射&#39;定义SMI以两种方式工作:
- 禁用SMI - 任何通配符都将替换为默认的RegEx,即:
<action name="Person*" method="perform*">
将被翻译为allowedMethod = "regex:perform([A-Za-z0-9_$]*)"
。- 启用SMI - 不会发生通配符替换,您必须严格定义可通过注释或
<allowed-method/>
标记访问的方法。
您可以按<package>
禁用它。
<package strict-method-invocation="false">
或者您可以使用<allowed-methods>
标记为每个操作添加允许的方法名称。
<action name="*Application" class="x.ApplicationHandler" method="{1}">
<result name="input">/WEB-INF/application.jsp</result>
<result name="success" type="redirectAction">
<param name="actionName">browseApps</param>
</result>
<allowed-methods>firstMethod, secondMethod, thirdMethod</allowed-methods>
</action>
使用<global-allowed-methods>
标记为每个包添加允许的方法名称。
<package extends="struts-default">
<global-allowed-methods>firstMethod, secondMethod, thirdMethod</global-allowed-methods>
</package>
注意要在struts.xml中使用上述代码,您必须将DTD定义更新为2.5
。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
...
</struts>
struts2-convention-plugin中还有@AllowedMethods
注释,允许操作指定允许的操作方法。
此注释可以直接在Action类或
package-info.java
类中使用,以便为所有子包指定全局允许的方法。