【问题标题】:Wildcard Action Mapping no longer working after updating to Struts 2.5更新到 Struts 2.5 后,通配符操作映射不再起作用
【发布时间】:2016-09-10 04:03:57
【问题描述】:

我在我的应用程序的struts.xml 中有以下操作映射,它在 Struts 2.3.28.1 上运行得很好;调用由x.ApplicationHandler.edit 方法处理的/editApplication 操作。

<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 发行说明,没有看到任何关于基于通配符的操作映射工作方式的更新。是否有任何原因导致此配置不再有效?

【问题讨论】:

  • 这是因为 SMI 正如 Aleksandr 已经解释过的那样,如果不允许使用方法,则会抛出缺少方法的异常。我想知道用“不允许此方法”抛出异常是否会更好,wdyt?
  • 是的,一个更有意义的例外在这里可能会很有帮助。
  • 我已经注册了一个问题来涵盖这个issues.apache.org/jira/browse/WW-4640

标签: struts2 wildcard-mapping


【解决方案1】:

它是Strict Method Invocation,从 Struts 2.5 开始默认启用。

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

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

  • SMI 已禁用 - 任何通配符都将替换为默认 RegEx,即:&lt;action name="Person*" method="perform*"&gt; 将被转换为 allowedMethod = "regex:perform([A-Za-z0-9_$]*)"
  • SMI 已启用 - 不会发生通配符替换,您必须严格定义可以通过注解或&lt;allowed-method/&gt; 标签访问的方法。

您可以通过 &lt;package&gt; 禁用它。

<package strict-method-invocation="false">

或者您可以使用&lt;allowed-methods&gt; 标签为每个操作添加允许的方法名称。

<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>

或使用&lt;global-allowed-methods&gt; 标记为每个包添加允许的方法名称。

<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 类中,以便为所有子包指定全局允许的方法。

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2011-07-25
    • 2018-11-03
    • 2014-01-26
    • 2015-03-11
    • 2014-04-12
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多