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.