Wildcard Action Mapping no longer working after updating to Struts 2.5

时光毁灭记忆、已成空白 提交于 2019-12-03 07:20:23

It is Strict Method Invocation and since Struts 2.5 it is enabled by default.

From the docs about SMI and wildcard mappings:

When using wildcard mapping in actions' definitions SMI works in two ways:

  • SMI is disabled - any wildcard will be substituted with the default RegEx, ie.: <action name="Person*" method="perform*"> will be translated into allowedMethod = "regex:perform([A-Za-z0-9_$]*)".
  • SMI is enabled - no wildcard substitution will happen, you must strictly define which methods can be accessed by annotations or <allowed-method/> tag.

You can disabled it per <package>.

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

OR you can add allowed methods names per action using <allowed-methods> tag.

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

OR add allowed methods names per package using <global-allowed-methods> tag.

<package extends="struts-default">

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

</package>

NOTE In order to use above tags in struts.xml you must update DTD definition to 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>

There is also @AllowedMethods annotation in struts2-convention-plugin which allows actions to specify allowed action methods.

This annotation can be used directly on Action classes or in the package-info.java class in order to specify global allowed methods for all sub-packages.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!