更新到Struts 2.5后,通配符操作映射不再起作用

joh*_*ohn 7 struts2 wildcard-mapping

我在我的应用程序中有以下动作映射struts.xml,它与Struts 2.3.28.1一起工作得很好; 调用/editApplicationx.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>   
Run Code Online (Sandbox Code Playgroud)

升级到Struts 2.5后,这不再有效.试图调用该/editApplication操作会显示404错误:

HTTP状态404 - 没有映射名称空间[/]和操作名称[editApplication]的操作

我已经回顾了Struts 2.5发行说明,并没有看到任何关于基于通配符的动作映射的工作方式的更新.是否有任何理由说明此配置不再有效?

Ale*_*r M 18

它是严格的方法调用,因为Struts 2.5默认启用它.

从有关SMI和通配符映射的文档:

在动作定义中使用通配符映射时,SMI以两种方式工作:

  • SMI被禁用 - 任何通配符都将被默认的RegEx替换,即:<action name="Person*" method="perform*">将被翻译成allowedMethod = "regex:perform([A-Za-z0-9_$]*)".
  • SMI已启用 - 不会发生通配符替换,您必须严格定义可通过注释或<allowed-method/>标记访问的方法.

你可以禁用它<package>.

<package strict-method-invocation="false">
Run Code Online (Sandbox Code Playgroud)

或者您可以使用<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>
Run Code Online (Sandbox Code Playgroud)

或使用<global-allowed-methods>标记为每个包添加允许的方法名称.

<package extends="struts-default">

    <global-allowed-methods>firstMethod, secondMethod, thirdMethod</global-allowed-methods>

</package>
Run Code Online (Sandbox Code Playgroud)

注意要在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>
Run Code Online (Sandbox Code Playgroud)

struts2-convention-plugin中还有@AllowedMethods注释,允许操作指定允许的操作方法.

此注释可以直接在Action类或package-info.java类中使用,以便为所有子包指定全局允许的方法.