Struts2インターセプターabstractInterceptorの使用方法

Struts2のインターセプターはリクエスト処理の前後に何らかの追加処理を行うために使用され、ロギング、権限検証、パラメータ検証などに利用できます。

Struts2ではAbstractInterceptorクラスを継承することで、独自のインターセプターを作ることができます。

AbstractInterceptorクラスを利用する手順は以下の通りです。

  1. AbstractInterceptor
  2. intercept
public class MyInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 在请求处理前的处理逻辑
        System.out.println("Before action execution");

        // 执行下一个拦截器或Action
        String result = invocation.invoke();

        // 在请求处理后的处理逻辑
        System.out.println("After action execution");

        return result;
    }
}
  1. ストラッツ.xml
<struts>
    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="myInterceptor" class="com.example.MyInterceptor" />
            <interceptor-stack name="myInterceptorStack">
                <interceptor-ref name="myInterceptor" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="myInterceptorStack" />
        <!-- 配置Action -->
    </package>
</struts>

myInterceptorという名前のインターセプタを、クラス名を指定して定義し、myInterceptorStackという名前のインターセプタスタックを定義し、そのスタックにはmyInterceptorとdefaultStack(デフォルトのインターセプタスタック)を含み、default-interceptor-refでmyInterceptorStackをデフォルトで使用するインターセプタスタックとして指定した設定

  1. 使用するアクションか全般設定に Interceptor を参照する。
<struts>
    <package name="default" extends="struts-default">
        <interceptors>
            <!-- ... -->
        </interceptors>
        <default-interceptor-ref name="myInterceptorStack" />
        
        <!-- 引用拦截器 -->
        <action name="myAction" class="com.example.MyAction">
            <interceptor-ref name="myInterceptor" />
            
            <!-- Action配置 -->
            
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

上記の設定ではmyActionの設定のなかにmyInterceptorというインタセプタを呼び出しています。

これにより、myActionをリクエストすると、最初にmyInterceptorインターセプターのinterceptメソッドが実行され、次に対応するActionメソッドが実行されます。Actionメソッドの実行が完了すると、myInterceptorインターセプターのinterceptメソッドが再び実行されます。

インターセプターのinterceptメソッドでinvocation.invokeメソッドを呼び出さないと、以降のインターセプターやアクションメソッドは実行されず、リクエストは処理されません。

bannerAds