Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

The framework makes it easy to share solutions to these concerns using an "Interceptor" strategy. When you request a resource that maps to an "action", the framework invokes the Action object. But, before the Action is executed, the invocation can be intercepted by another object. After the Action executes, the invocation could be intercepted again. Unsurprisingly, we call these objects "Interceptors."

Table of Contents
minLevel2

Understanding Interceptors

...

Code Block
xml
titlestruts.xml

<package name="default" extends="struts-default">
   <interceptors>
       <interceptor name="timer" class=".."/>
       <interceptor name="logger" class=".."/>
   </interceptors>

   <action name="login"
      class="tutorial.Login">
        <interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
         <result name="input">login.jsp</result>
         <result name="success"
            type="redirect-actionredirectAction">/secure/home</result>
   </action>
</package>

...

Code Block
xml
titlestruts.xml

<package name="default" extends="struts-default">
   <interceptors>
        <interceptor name="timer" class=".."/>
        <interceptor name="logger" class=".."/>
        <interceptor-stack name="myStack">
           <interceptor-ref name="timer"/>
           <interceptor-ref name="logger"/>
        </interceptor-stack>
    </interceptors>

<action name="login"
     class="tutuorial.Login">
         <interceptor-ref name="myStack"/>
         <result name="input">login.jsp</result>
         <result name="success"
             type="redirect-actionredirectAction">/secure/home</result>
</action>
</package>

...

Interceptor

Name

Description

Alias Interceptor

alias

Converts similar parameters that may be named differently between requests.

Chaining Interceptor

chain

Makes the previous Action's properties available to the current Action. Commonly used together with <result type="chain"> (in the previous Action).

Checkbox Interceptor

checkbox

Adds automatic checkbox handling code that detect an unchecked checkbox and add it as a parameter with a default (usually 'false') value. Uses a specially named hidden field to detect unsubmitted checkboxes. The default unchecked value is overridable for non-boolean value'd checkboxes.

Cookie Interceptor

cookie

Inject cookie with a certain configurable name / value into action. (Since 2.0.7.)

CookieProvider Interceptor

cookieProvider

Transfer cookies from action to response (Since 2.3.15.)

Conversion Error Interceptor

conversionError

Adds conversion errors from the ActionContext to the Action's field errors

Create Session Interceptor

createSession

Create an HttpSession automatically, useful with certain Interceptors that require a HttpSession to work properly (like the TokenInterceptor)

DebuggingInterceptor

debugging

Provides several different debugging screens to provide insight into the data behind the page.

DeprecationInterceptor

deprecation

When devMode is on, logs all unknown or deprecated settings

Execute and Wait Interceptor

execAndWait

Executes the Action in the background and then sends the user off to an intermediate waiting page.

Exception Interceptor

exception

Maps exceptions to a result.

File Upload Interceptor

fileUpload

An Interceptor that adds easy access to file upload support.

I18n Interceptor

i18n

Remembers the locale selected for a user's session.

Logger Interceptor

logger

Outputs the name of the Action.

Message Store Interceptor

store

Store and retrieve action messages / errors / field errors for action that implements ValidationAware interface into session.

Model Driven Interceptor

model-driven modelDriven

If the Action implements ModelDriven, pushes the getModel Result onto the Value Stack.

Scoped Model Driven Interceptor

scoped-model-driven scopedModelDriven

If the Action implements ScopedModelDriven, the interceptor retrieves and stores the model from a scope and sets it on the action calling setModel.

Parameters Interceptor

params

Sets the request parameters onto the Action.

Prepare Interceptor

prepare

If the Action implements Preparable, calls its prepare method.

Scope Interceptor

scope

Simple mechanism for storing Action state in the session or application scope.

Servlet Config Interceptor

servletConfig

Provide access to Maps representing HttpServletRequest and HttpServletResponse.

Static Parameters Interceptor

staticParams

Sets the struts.xml defined parameters onto the action. These are the <param> tags that are direct children of the <action> tag.

Roles Interceptor

roles

Action will only be executed if the user has the correct JAAS role.

Timer Interceptor

timer

Outputs how long the Action takes to execute (including nested Interceptors and View)

Token Interceptor

token

Checks for valid token presence in Action, prevents duplicate form submission.

Token Session Interceptor

tokenSession

Same as Token Interceptor, but stores the submitted data in session when handed an invalid token

Validation Interceptor

validation

Performs validation using the validators defined in action-validation.xml

Default Workflow Interceptor

workflow

Calls the validate method in your Action class. If Action errors are created then it returns the INPUT view.

Parameter Filter Interceptor

N/A

Removes parameters from the list of those available to Actions

Profiling Interceptor

profiling

Activate profiling through parameter

Multiselect Interceptor

multiselect

Like the checkbox interceptor detects that no value was selected for a field with multiple values (like a select) and adds an empty parameter

Warning

Since 2.0.7, Interceptors and Results with hyphenated names were converted to camelCase. (The former model-driven is now modelDriven.) The original hyphenated names are retained as "aliases" until Struts 2.1.0. For clarity, the hyphenated versions are not listed here, but might be referenced in prior versions of the documentation.

...

Wiki Markup
{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.interceptor/.MethodFilterInterceptor.java}

Interceptor Parameter Overriding

Wiki Markup
{snippet:id=parameterOverriding|javadoc=true|url=com.opensymphony.xwork2.interceptor/Interceptor.java}

Interceptor's parameter could be overridden through the following ways :

Method 1:

Code Block
xml
<action name="myAction" class="myActionClass">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="validation">
        <param name="excludeMethods">myValidationExcudeMethod</param>
    </interceptor-ref>
    <interceptor-ref name="workflow">
        <param name="excludeMethods">myWorkflowExcludeMethod</param>
    </interceptor-ref>
</action>

Method 2:

Code Block
xml
<action name="myAction" class="myActionClass">
    <interceptor-ref name="defaultStack">
        <param name="validation.excludeMethods">myValidationExcludeMethod</param>
        <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
    </interceptor-ref>
</action>

In the first method, the whole default stack is copied and the parameter then changed accordingly.

In the second method, the interceptor-ref refers to an existing interceptor-stack, namely defaultStack in this example, and override the validator and workflow interceptor excludeMethods attribute. Note that in the param tag, the name attribute contains a dot (.) the word before the dot(.) specifies the interceptor name whose parameter is to be overridden and the word after the dot (.) specifies the parameter itself. The syntax is as follows:

Code Block
   <interceptor-name>.<parameter-name>

Note also that in this case the interceptor-ref name attribute is used to indicate an interceptor stack which makes sense as if it is referring to the interceptor itself it would be just using Method 1 describe above.

Method 3:

Code Block
xml
<interceptors>
    <interceptor-stack name="parentStack">
        <interceptor-ref name="defaultStack">
            <param name="params.excludeParams">token</param>
        </interceptor-ref>
    </interceptor-stack>
</interceptors>

<default-interceptor-ref name="parentStack"/>

Interceptor Parameter Overriding Inheritance

Parameters override are not inherited in interceptors, meaning that the last set of overridden parameters will be used. For example, if a stack overrides the parameter "defaultBlock" for the "postPrepareParameterFilter" interceptor as:

Code Block
xml
<interceptor-stack name="parentStack">
  <interceptor-ref name="postPrepareParameterFilter">
    <param name="defaultBlock">true</param>
  </interceptor-ref>
</interceptor-stack>

and an action overrides the "allowed" for "postPrepareParameterFilter":

Code Block
xml
<package name="child2" namespace="/child" extends="parentPackage">
  <action name="list" class="SomeAction">
    <interceptor-ref name="parentStack">
      <param name="postPrepareParameterFilter.allowed">myObject.name</param>
    </interceptor-ref>
  </action>
</package>

Then, only "allowed" will be overridden for the "postPrepareParameterFilter" interceptor in that action, the other params will be null.

Order of Interceptor Execution

Interceptors provide an excellent means to wrap before/after processing. The concept reduces code duplication (think AOP).

Code Block
xml
<interceptor-stack name="xaStack">
  <interceptor-ref name="thisWillRunFirstInterceptor"/>
  <interceptor-ref name="thisWillRunNextInterceptor"/>
  <interceptor-ref name="followedByThisInterceptor"/>
  <interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>

...

Interceptors implementing com.opensymphony.xwork2.interceptor.PreResultListener will run after the Action executes but before the Result executes.

Code Block

thisWillRunFirstInterceptor
  thisWillRunNextInterceptor
    followedByThisInterceptor
      thisWillRunLastInterceptor
        MyAction1
        MyAction2 (chain)
        MyPreResultListener
        MyResult (result)
      thisWillRunLastInterceptor
    followedByThisInterceptor
  thisWillRunNextInterceptor
thisWillRunFirstInterceptor

...

Next: Action Chaining Writing Interceptors