This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch asf-staging
in repository https://gitbox.apache.org/repos/asf/struts-site.git
The following commit(s) were added to refs/heads/asf-staging by this push:
new a5c1e9b931 Updates stage by Jenkins
a5c1e9b931 is described below
commit a5c1e9b93167c7dd52f8724ff61cfc8faafdeeee
Author: jenkins <[email protected]>
AuthorDate: Sat Nov 7 17:55:00 2026 +0000
Updates stage by Jenkins
---
content/core-developers/coep-interceptor.html | 29 +++++++----
content/core-developers/coop-interceptor.html | 29 +++++++----
.../fetch-metadata-interceptor.html | 56 +++++++++++++++++++---
content/core-developers/interceptors.html | 4 ++
content/core-developers/struts-default-xml.html | 4 ++
content/getting-started/coding-actions.html | 10 +++-
content/plugins/rest/index.html | 3 +-
7 files changed, 106 insertions(+), 29 deletions(-)
diff --git a/content/core-developers/coep-interceptor.html
b/content/core-developers/coep-interceptor.html
index f57ebac0f4..a5aa77cd94 100644
--- a/content/core-developers/coep-interceptor.html
+++ b/content/core-developers/coep-interceptor.html
@@ -171,23 +171,32 @@ by another document with COEP. All descendents of a
document with COEP will also
<h2 id="parameters">Parameters</h2>
<ul>
- <li><code class="language-plaintext highlighter-rouge">exemptedPaths</code>
- Set of opt out endpoints that are meant to serve cross-site traffic. Paths
should contain leading
- slashes and must be relative. This field is empty by default.</li>
+ <li><code class="language-plaintext highlighter-rouge">exemptedPaths</code>
- Comma-separated list of request paths the COEP header is not sent on. Each
entry is compared exactly
+with the path of the request inside the web application: the servlet path plus
the path info, without the context path
+and without the query string. Include the action extension, e.g. <code
class="language-plaintext highlighter-rouge">/embed/widget.action</code>; if an
action is reachable
+with several extensions, list each form. This field is empty by default.</li>
<li><code class="language-plaintext highlighter-rouge">enforcingMode</code>
- Boolean variable allowing the user to let COEP operate in <code
class="language-plaintext highlighter-rouge">enforcing</code>, which blocks
both resource
and reports violations, or <code class="language-plaintext
highlighter-rouge">report-only</code> mode, which only reports violations.
Default value for field is <code class="language-plaintext
highlighter-rouge">false</code>.</li>
<li><code class="language-plaintext highlighter-rouge">disabled</code> -
Boolean variable disabling and enabling COEP. Default value for field is <code
class="language-plaintext highlighter-rouge">false</code>.</li>
</ul>
+<p class="alert alert-warning">Before Struts 7.5.0 and 6.13.0 <code
class="language-plaintext highlighter-rouge">exemptedPaths</code> was compared
with the context path of the application, so an entry
+naming a request path had no effect and an entry equal to the context path
disabled the interceptor for the whole
+application. Use <code class="language-plaintext
highlighter-rouge">disabled</code> if you relied on the latter.</p>
+
<h2 id="examples">Examples</h2>
-<div class="language-xml highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="nt"><action</span> <span
class="na">name=</span><span class="s">"someAction"</span> <span
class="na">class=</span><span class="s">"com.examples.SomeAction"</span><span
class="nt">></span>
- <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"defaultStack"</span><span
class="nt">></span>
- <span class="nt"><param</span> <span class="na">name=</span><span
class="s">"coep.exemptedPaths"</span><span
class="nt">></span>/path1,/path2,/path3<span class="nt"></param></span>
- <span class="nt"><param</span> <span class="na">name=</span><span
class="s">"coep.enforcingMode"</span><span class="nt">></span>false<span
class="nt"></param></span>
- <span class="nt"><param</span> <span class="na">name=</span><span
class="s">"coep.disabled"</span><span class="nt">></span>false<span
class="nt"></param></span>
- <span class="nt"></interceptor-ref></span>
- <span class="nt"><result</span> <span class="na">name=</span><span
class="s">"success"</span><span class="nt">></span>good_result.ftl<span
class="nt"></result></span>
-<span class="nt"></action></span>
+<div class="language-xml highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="nt"><package</span> <span
class="na">name=</span><span class="s">"default"</span> <span
class="na">extends=</span><span class="s">"struts-default"</span><span
class="nt">></span>
+ <span class="nt"><interceptors></span>
+ <span class="nt"><interceptor-stack</span> <span
class="na">name=</span><span class="s">"appDefaultStack"</span><span
class="nt">></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"defaultStack"</span><span
class="nt">></span>
+ <span class="nt"><param</span> <span
class="na">name=</span><span class="s">"coep.exemptedPaths"</span><span
class="nt">></span>/embed/widget.action<span class="nt"></param></span>
+ <span class="nt"><param</span> <span
class="na">name=</span><span class="s">"coep.enforcingMode"</span><span
class="nt">></span>false<span class="nt"></param></span>
+ <span class="nt"></interceptor-ref></span>
+ <span class="nt"></interceptor-stack></span>
+ <span class="nt"></interceptors></span>
+ <span class="nt"><default-interceptor-ref</span> <span
class="na">name=</span><span class="s">"appDefaultStack"</span><span
class="nt">/></span>
+<span class="nt"></package></span>
</code></pre></div></div>
</section>
diff --git a/content/core-developers/coop-interceptor.html
b/content/core-developers/coop-interceptor.html
index da27218051..a8aa365993 100644
--- a/content/core-developers/coop-interceptor.html
+++ b/content/core-developers/coop-interceptor.html
@@ -187,21 +187,32 @@ to allow popups they open to be in their browsing context
group (unless the popu
<h2 id="parameters">Parameters</h2>
<ul>
- <li><code class="language-plaintext highlighter-rouge">exemptedPaths</code>
- Set of opt out endpoints that are meant to serve cross-site traffic. Paths
should contain leading
-slashes and must be relative. This field is empty by default.</li>
+ <li><code class="language-plaintext highlighter-rouge">exemptedPaths</code>
- Comma-separated list of request paths the COOP header is not sent on. Each
entry is compared exactly
+with the path of the request inside the web application: the servlet path plus
the path info, without the context path
+and without the query string. Include the action extension, e.g. <code
class="language-plaintext highlighter-rouge">/popup/callback.action</code>; if
an action is reachable
+with several extensions, list each form. This field is empty by default.</li>
<li><code class="language-plaintext highlighter-rouge">mode</code> - The
policy mode COOP should follow. Available modes are <code
class="language-plaintext highlighter-rouge">same-origin</code>, <code
class="language-plaintext highlighter-rouge">same-origin-allow-popups</code>,
<code class="language-plaintext highlighter-rouge">unsafe-none</code>. Default
mode is <code class="language-plaintext
highlighter-rouge">same-origin</code>.</li>
+ <li><code class="language-plaintext highlighter-rouge">disabled</code> - Set
to <code class="language-plaintext highlighter-rouge">true</code> to skip the
interceptor for an action. Default value is <code class="language-plaintext
highlighter-rouge">false</code>.</li>
</ul>
+<p class="alert alert-warning">Before Struts 7.5.0 and 6.13.0 <code
class="language-plaintext highlighter-rouge">exemptedPaths</code> was compared
with the context path of the application, so an entry
+naming a request path had no effect and an entry equal to the context path
disabled the interceptor for the whole
+application. Use <code class="language-plaintext
highlighter-rouge">disabled</code> if you relied on the latter.</p>
+
<h2 id="examples">Examples</h2>
-<div class="language-xml highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="nt"><action</span> <span
class="na">name=</span><span class="s">"someAction"</span> <span
class="na">class=</span><span class="s">"com.examples.SomeAction"</span><span
class="nt">></span>
- <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"defaultStack"</span><span
class="nt">></span>
- <span class="nt"><param</span> <span class="na">name=</span><span
class="s">"coop.exemptedPaths"</span><span
class="nt">></span>/path1,/path2,/path3<span class="nt"></param></span>
- <span class="nt"><param</span> <span class="na">name=</span><span
class="s">"coop.mode"</span><span class="nt">></span>same-origin<span
class="nt"></param></span>
- <span class="nt"></interceptor-ref></span>
- <span class="nt"><result</span> <span class="na">name=</span><span
class="s">"success"</span><span class="nt">></span>good_result.ftl<span
class="nt"></result></span>
-<span class="nt"></action></span>
+<div class="language-xml highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="nt"><package</span> <span
class="na">name=</span><span class="s">"default"</span> <span
class="na">extends=</span><span class="s">"struts-default"</span><span
class="nt">></span>
+ <span class="nt"><interceptors></span>
+ <span class="nt"><interceptor-stack</span> <span
class="na">name=</span><span class="s">"appDefaultStack"</span><span
class="nt">></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"defaultStack"</span><span
class="nt">></span>
+ <span class="nt"><param</span> <span
class="na">name=</span><span class="s">"coop.exemptedPaths"</span><span
class="nt">></span>/popup/callback.action<span
class="nt"></param></span>
+ <span class="nt"><param</span> <span
class="na">name=</span><span class="s">"coop.mode"</span><span
class="nt">></span>same-origin<span class="nt"></param></span>
+ <span class="nt"></interceptor-ref></span>
+ <span class="nt"></interceptor-stack></span>
+ <span class="nt"></interceptors></span>
+ <span class="nt"><default-interceptor-ref</span> <span
class="na">name=</span><span class="s">"appDefaultStack"</span><span
class="nt">/></span>
+<span class="nt"></package></span>
</code></pre></div></div>
</section>
diff --git a/content/core-developers/fetch-metadata-interceptor.html
b/content/core-developers/fetch-metadata-interceptor.html
index 2c3d0fdbe4..6570b3d519 100644
--- a/content/core-developers/fetch-metadata-interceptor.html
+++ b/content/core-developers/fetch-metadata-interceptor.html
@@ -160,32 +160,74 @@
information leaks. Uses a default Resource Isolation Policy to
programmatically reject cross-origin requests.</p>
<p>A Resource Isolation Policy is a strong defense in-depth mechanism that
prevents the resources on a server from being
-requested by external websites. This policy can be enabled either for all
endpoints of the application and endpoints
+requested by external websites. The interceptor is part of the <code
class="language-plaintext highlighter-rouge">defaultStack</code> and is enabled
by default; endpoints
that are meant to be loaded in a cross-site context can be exempted from the
policy.</p>
<p>The browser provides information about the context of an HTTP request in a
set of <code class="language-plaintext highlighter-rouge">Sec-Fetch-*</code>
headers. This allows
the server processing the request to make decisions on whether the request
should be accepted or rejected based
on the preferred resource isolation policy. Struts provides a default
<em>Resource Isolation Policy</em> that rejects
-<em>cross-origin</em> requests that aren’t top level navigations.</p>
+<em>cross-site</em> requests that aren’t simple top level navigations:</p>
-<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre
class="highlight"><code>Sec-Fetch-Site == 'cross-site' AND (Sec-Fetch-Mode !=
'navigate'/'nested-navigate' OR method NOT IN [GET, HEAD])
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre
class="highlight"><code>Sec-Fetch-Site == 'cross-site' AND (Sec-Fetch-Mode !=
'navigate' OR method NOT IN [GET, HEAD] OR Sec-Fetch-Dest IN [object, embed])
</code></pre></div></div>
+<p>Requests without a <code class="language-plaintext
highlighter-rouge">Sec-Fetch-Site</code> header and <code
class="language-plaintext highlighter-rouge">same-origin</code>, <code
class="language-plaintext highlighter-rouge">same-site</code> and <code
class="language-plaintext highlighter-rouge">none</code> requests are always
accepted.</p>
+
<p>Refer to <a
href="https://web.dev/fetch-metadata/#implementing-a-resource-isolation-policy">Implementing
a Resource Isolation Policy</a>
for further information on implementing effective Resource Isolation Policies.
Fetch Metadata is supported in all major browsers.</p>
+<h2 id="cross-site-form-posts">Cross-site form posts</h2>
+
+<p class="alert alert-info">Since Struts 7.5.0 and 6.13.0 cross-site <code
class="language-plaintext highlighter-rouge">POST</code> navigations are
rejected with <code class="language-plaintext highlighter-rouge">403</code>.</p>
+
+<p>Flows where another site posts the user’s browser back to your application
are affected, for example:</p>
+
+<ul>
+ <li>a SAML assertion consumer service or an OpenID Connect <code
class="language-plaintext highlighter-rouge">form_post</code> response,</li>
+ <li>a payment gateway returning the user to the shop.</li>
+</ul>
+
+<p>Exempt the endpoints receiving these requests, either by path with <code
class="language-plaintext highlighter-rouge">exemptedPaths</code> or per action
with the <code class="language-plaintext highlighter-rouge">disabled</code>
+parameter, see the examples below.</p>
+
<h2 id="parameters">Parameters</h2>
<ul>
- <li><code class="language-plaintext highlighter-rouge">exemptedPaths</code>
- Set of opt out endpoints that are meant to serve cross-site traffic. Paths
should contain leading
- slashes and must be relative. This field is empty by default.</li>
+ <li><code class="language-plaintext highlighter-rouge">exemptedPaths</code>
- Comma-separated list of request paths the policy is not applied to. Each
entry is compared exactly
+with the path of the request inside the web application: the servlet path plus
the path info, without the context path
+and without the query string. Include the action extension, e.g. <code
class="language-plaintext highlighter-rouge">/saml/acs.action</code>; if an
action is reachable with
+several extensions, list each form. This field is empty by default.</li>
+ <li><code class="language-plaintext highlighter-rouge">disabled</code> - Set
to <code class="language-plaintext highlighter-rouge">true</code> to skip the
interceptor for an action. Default value is <code class="language-plaintext
highlighter-rouge">false</code>.</li>
</ul>
+<p class="alert alert-warning">Before Struts 7.5.0 and 6.13.0 <code
class="language-plaintext highlighter-rouge">exemptedPaths</code> was compared
with the context path of the application, so an entry
+naming a request path had no effect and an entry equal to the context path
disabled the interceptor for the whole
+application. Use <code class="language-plaintext
highlighter-rouge">disabled</code> if you relied on the latter.</p>
+
+<p>When <code class="language-plaintext
highlighter-rouge">struts.mapper.action.prefix.enabled</code> is set to <code
class="language-plaintext highlighter-rouge">true</code> (it is <code
class="language-plaintext highlighter-rouge">false</code> by default), a
request to an exempted path
+can use the <code class="language-plaintext highlighter-rouge">action:</code>
parameter prefix to execute another action in the same namespace.</p>
+
<h2 id="examples">Examples</h2>
-<div class="language-xml highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="nt"><action</span> <span
class="na">name=</span><span class="s">"someAction"</span> <span
class="na">class=</span><span class="s">"com.examples.SomeAction"</span><span
class="nt">></span>
+<p>Exempt selected paths for every action using the stack:</p>
+
+<div class="language-xml highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="nt"><package</span> <span
class="na">name=</span><span class="s">"default"</span> <span
class="na">extends=</span><span class="s">"struts-default"</span><span
class="nt">></span>
+ <span class="nt"><interceptors></span>
+ <span class="nt"><interceptor-stack</span> <span
class="na">name=</span><span class="s">"appDefaultStack"</span><span
class="nt">></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"defaultStack"</span><span
class="nt">></span>
+ <span class="nt"><param</span> <span
class="na">name=</span><span
class="s">"fetchMetadata.exemptedPaths"</span><span
class="nt">></span>/saml/acs.action,/payment/return.action<span
class="nt"></param></span>
+ <span class="nt"></interceptor-ref></span>
+ <span class="nt"></interceptor-stack></span>
+ <span class="nt"></interceptors></span>
+ <span class="nt"><default-interceptor-ref</span> <span
class="na">name=</span><span class="s">"appDefaultStack"</span><span
class="nt">/></span>
+<span class="nt"></package></span>
+</code></pre></div></div>
+
+<p>Disable the interceptor for a single action:</p>
+
+<div class="language-xml highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="nt"><action</span> <span
class="na">name=</span><span class="s">"acs"</span> <span
class="na">class=</span><span
class="s">"com.examples.SamlAssertionConsumerAction"</span><span
class="nt">></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"defaultStack"</span><span
class="nt">></span>
- <span class="nt"><param</span> <span
class="na">name=</span><span
class="s">"fetchMetadata.exemptedPaths"</span><span
class="nt">></span>/path1,/path2,/path3<span class="nt"></param></span>
+ <span class="nt"><param</span> <span class="na">name=</span><span
class="s">"fetchMetadata.disabled"</span><span class="nt">></span>true<span
class="nt"></param></span>
<span class="nt"></interceptor-ref></span>
<span class="nt"><result</span> <span class="na">name=</span><span
class="s">"success"</span><span class="nt">></span>good_result.ftl<span
class="nt"></result></span>
<span class="nt"></action></span>
diff --git a/content/core-developers/interceptors.html
b/content/core-developers/interceptors.html
index 145ff51526..325013d9ce 100644
--- a/content/core-developers/interceptors.html
+++ b/content/core-developers/interceptors.html
@@ -339,6 +339,7 @@ than reiterate the same list of Interceptors, we can bundle
these Interceptors t
<span class="nt"><interceptor</span> <span
class="na">name=</span><span class="s">"noop"</span> <span
class="na">class=</span><span
class="s">"org.apache.struts2.interceptor.NoOpInterceptor"</span><span
class="nt">/></span>
<span class="nt"><interceptor</span> <span
class="na">name=</span><span class="s">"fetchMetadata"</span> <span
class="na">class=</span><span
class="s">"org.apache.struts2.interceptor.FetchMetadataInterceptor"</span><span
class="nt">/></span>
<span class="nt"><interceptor</span> <span
class="na">name=</span><span class="s">"httpMethod"</span> <span
class="na">class=</span><span
class="s">"org.apache.struts2.interceptor.httpmethod.HttpMethodInterceptor"</span>
<span class="nt">/></span>
+ <span class="nt"><interceptor</span> <span
class="na">name=</span><span class="s">"actionExtension"</span> <span
class="na">class=</span><span
class="s">"org.apache.struts2.interceptor.ActionExtensionInterceptor"</span><span
class="nt">/></span>
<span class="c"><!-- Empty stack - performs no operations
--></span>
<span class="nt"><interceptor-stack</span> <span
class="na">name=</span><span class="s">"emptyStack"</span><span
class="nt">></span>
@@ -350,6 +351,7 @@ than reiterate the same list of Interceptors, we can bundle
these Interceptors t
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"exception"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"servletConfig"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"httpMethod"</span><span
class="nt">/></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"actionExtension"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"prepare"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"checkbox"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"datetime"</span><span
class="nt">/></span>
@@ -412,6 +414,7 @@ than reiterate the same list of Interceptors, we can bundle
these Interceptors t
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"params"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"servletConfig"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"httpMethod"</span><span
class="nt">/></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"actionExtension"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"prepare"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"chain"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"modelDriven"</span><span
class="nt">/></span>
@@ -444,6 +447,7 @@ than reiterate the same list of Interceptors, we can bundle
these Interceptors t
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"alias"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"servletConfig"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"httpMethod"</span><span
class="nt">/></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"actionExtension"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"i18n"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"csp"</span><span class="nt">></span>
<span class="nt"><param</span> <span
class="na">name=</span><span class="s">"disabled"</span><span
class="nt">></span>false<span class="nt"></param></span>
diff --git a/content/core-developers/struts-default-xml.html
b/content/core-developers/struts-default-xml.html
index 26974a9c26..acba826565 100644
--- a/content/core-developers/struts-default-xml.html
+++ b/content/core-developers/struts-default-xml.html
@@ -253,6 +253,7 @@ setting in <a
href="default-properties">default.properties</a>.</p>
<span class="nt"><interceptor</span> <span
class="na">name=</span><span class="s">"noop"</span> <span
class="na">class=</span><span
class="s">"org.apache.struts2.interceptor.NoOpInterceptor"</span><span
class="nt">/></span>
<span class="nt"><interceptor</span> <span
class="na">name=</span><span class="s">"fetchMetadata"</span> <span
class="na">class=</span><span
class="s">"org.apache.struts2.interceptor.FetchMetadataInterceptor"</span><span
class="nt">/></span>
<span class="nt"><interceptor</span> <span
class="na">name=</span><span class="s">"httpMethod"</span> <span
class="na">class=</span><span
class="s">"org.apache.struts2.interceptor.httpmethod.HttpMethodInterceptor"</span>
<span class="nt">/></span>
+ <span class="nt"><interceptor</span> <span
class="na">name=</span><span class="s">"actionExtension"</span> <span
class="na">class=</span><span
class="s">"org.apache.struts2.interceptor.ActionExtensionInterceptor"</span><span
class="nt">/></span>
<span class="c"><!-- Empty stack - performs no operations
--></span>
<span class="nt"><interceptor-stack</span> <span
class="na">name=</span><span class="s">"emptyStack"</span><span
class="nt">></span>
@@ -264,6 +265,7 @@ setting in <a
href="default-properties">default.properties</a>.</p>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"exception"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"servletConfig"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"httpMethod"</span><span
class="nt">/></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"actionExtension"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"prepare"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"checkbox"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"datetime"</span><span
class="nt">/></span>
@@ -326,6 +328,7 @@ setting in <a
href="default-properties">default.properties</a>.</p>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"params"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"servletConfig"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"httpMethod"</span><span
class="nt">/></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"actionExtension"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"prepare"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"chain"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"modelDriven"</span><span
class="nt">/></span>
@@ -358,6 +361,7 @@ setting in <a
href="default-properties">default.properties</a>.</p>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"alias"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"servletConfig"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"httpMethod"</span><span
class="nt">/></span>
+ <span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"actionExtension"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"i18n"</span><span
class="nt">/></span>
<span class="nt"><interceptor-ref</span> <span
class="na">name=</span><span class="s">"csp"</span><span class="nt">></span>
<span class="nt"><param</span> <span
class="na">name=</span><span class="s">"disabled"</span><span
class="nt">></span>false<span class="nt"></param></span>
diff --git a/content/getting-started/coding-actions.html
b/content/getting-started/coding-actions.html
index 678c46bd19..cefa391119 100644
--- a/content/getting-started/coding-actions.html
+++ b/content/getting-started/coding-actions.html
@@ -262,7 +262,15 @@ those form field values provided it has a public set
method that matches the for
<p>To personalize the MessageStore message (recall that class MessageStore is
storing the message to display)
add the following Java code to the HelloWorldAction’s execute method after the
statement that instantiates
-the MessageStore object.</p>
+the MessageStore object. Before doing so, you need to add the following <code
class="language-plaintext highlighter-rouge">setMessage</code> method to
+<code class="language-plaintext highlighter-rouge">MessageStore</code>
class.</p>
+
+<p><strong>Add setMessage method to MessageStore</strong></p>
+
+<div class="language-java highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="kd">public</span> <span
class="kt">void</span> <span class="nf">setMessage</span><span
class="o">(</span><span class="nc">String</span> <span
class="n">message</span><span class="o">)</span> <span class="o">{</span>
+ <span class="k">this</span><span class="o">.</span><span
class="na">message</span> <span class="o">=</span> <span
class="n">message</span><span class="o">;</span>
+<span class="o">}</span>
+</code></pre></div></div>
<p><strong>Add userName value to message</strong></p>
diff --git a/content/plugins/rest/index.html b/content/plugins/rest/index.html
index 61ef803e9a..ac31915aa2 100644
--- a/content/plugins/rest/index.html
+++ b/content/plugins/rest/index.html
@@ -242,7 +242,7 @@ to truncate the identifier from the url and store it as a
parameter.</li>
<li><code class="language-plaintext
highlighter-rouge">struts.mapper.postMethodName</code> - The method name to
call for a POST request with no id parameter. Defaults to
<strong>create</strong>.</li>
<li><code class="language-plaintext
highlighter-rouge">struts.mapper.putMethodName</code> - The method name to
call for a PUT request with an id parameter. Defaults to
<strong>update</strong>.</li>
<li><code class="language-plaintext
highlighter-rouge">struts.mapper.deleteMethodName</code> - The method name to
call for a DELETE request with an id parameter. Defaults to
<strong>destroy</strong>.</li>
- <li><code class="language-plaintext
highlighter-rouge">struts.mapper.editMethodName</code> - The method name to
call for a GET request with an id parameter and the <strong>edit</strong> view
specified. Defaults to <strong>edit</strong>.</li>
+ <li><code class="language-plaintext
highlighter-rouge">struts.mapper.editMethodName</code> - The method whose
result is rendered when a PUT request fails validation. Defaults to
<strong>edit</strong>. The mapper itself no longer reads it: the
<strong>edit</strong> view is selected by the <code class="language-plaintext
highlighter-rouge">/edit</code> URL form, which names the method.</li>
<li><code class="language-plaintext
highlighter-rouge">struts.mapper.newMethodName</code> - The method name to
call for a GET request with no id parameter and the <strong>new</strong> view
specified. Defaults to <strong>editNew</strong>.</li>
</ul>
@@ -251,7 +251,6 @@ to truncate the identifier from the url and store it as a
parameter.</li>
<ul>
<li><code class="language-plaintext highlighter-rouge">GET: /movies</code>
=> method=<strong>index</strong></li>
<li><code class="language-plaintext highlighter-rouge">GET:
/movies/Thrillers</code> => method=<strong>show</strong>,
id=<strong>Thrillers</strong></li>
- <li><code class="language-plaintext highlighter-rouge">GET:
/movies/Thrillers;edit</code> => method=<strong>edit</strong>,
id=<strong>Thrillers</strong></li>
<li><code class="language-plaintext highlighter-rouge">GET:
/movies/Thrillers/edit</code> => method=<strong>edit</strong>,
id=<strong>Thrillers</strong></li>
<li><code class="language-plaintext highlighter-rouge">GET:
/movies/new</code> => method=<strong>editNew</strong></li>
<li><code class="language-plaintext highlighter-rouge">POST: /movies</code>
=> method=<strong>create</strong></li>