Struts2のインターセプタは、無設定のときには struts2のjarファイルに含まれる struts-default.xmlの定義にある defaultStack のインターセプタ・スタック(=インターセプタの組み合わせを定義したもの)が使われます。
defaultStackの内容は、以下のとおり、複数のインターセプタを経てActionクラスへのフィールドならびにStruts2内部のOgnlValueStackへ情報が格納されていきます。
xml
1 <interceptor-stack name="defaultStack">
2 <interceptor-ref name="exception"/>
3 <interceptor-ref name="alias"/>
4 <interceptor-ref name="servletConfig"/>
5 <interceptor-ref name="i18n"/>
6 <interceptor-ref name="prepare"/>
7 <interceptor-ref name="chain"/>
8 <interceptor-ref name="scopedModelDriven"/>
9 <interceptor-ref name="modelDriven"/>
10 <interceptor-ref name="fileUpload"/>
11 <interceptor-ref name="checkbox"/>
12 <interceptor-ref name="datetime"/>
13 <interceptor-ref name="multiselect"/>
14 <interceptor-ref name="staticParams"/>
15 <interceptor-ref name="actionMappingParams"/>
16 <interceptor-ref name="params"/>
17 <interceptor-ref name="conversionError"/>
18 <interceptor-ref name="validation">
19 <param name="excludeMethods">input,back,cancel,browse</param>
20 </interceptor-ref>
21 <interceptor-ref name="workflow">
22 <param name="excludeMethods">input,back,cancel,browse</param>
23 </interceptor-ref>
24 <interceptor-ref name="debugging"/>
25 </interceptor-stack>
なぜdefaultStackが利用されるかは、同じく struts-default.xml の末の方に書かれている
xml
1<default-interceptor-ref name="defaultStack"/>
で定義されているからです。
ではtokenInterceptorはどのように追加するべきかですが、それは defaultStackをカスタマイズしますが、もっと簡単で確実な方法は、 defaultStackの後に tokenInterceptor を後刺し します。
struts.xml
xml
1<?xml version="1.0" encoding="UTF-8" ?>
2<!DOCTYPE struts PUBLIC
3 "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
4 "http://struts.apache.org/dtds/struts-2.5.dtd">
5<struts>
6 <constant name="struts.enable.DynamicMethodInvocation" value="false" />
7 <constant name="struts.devMode" value="true" />
8
9 <package name="custom" extends="struts-default">
10 <interceptors>
11 <interceptor-stack name="tokenStack">
12 <interceptor-ref name="defaultStack" />
13 <interceptor-ref name="token" />
14 </interceptor-stack>
15 </interceptors>
16 <default-interceptor-ref name="tokenStack"/>
17 </package>
18</struts>
このstruts.xmlの設定により、struts-default の設定を継承した custom 設定ができ、customのインターセプタスタックで、tokenStack が標準で利用できる準備ができました。
これを使うActionクラスは、例えばConventionプラグインを利用した例では、以下のように @ParentPackage
で先ほど作成した custom を指定します。
java
1import org.apache.struts2.convention.annotation.Action;
2import org.apache.struts2.convention.annotation.Namespace;
3import org.apache.struts2.convention.annotation.ParentPackage;
4import org.apache.struts2.convention.annotation.Result;
5import org.apache.struts2.convention.annotation.Results;
6
7import com.opensymphony.xwork2.ActionSupport;
8
9@Namespace("/sports")
10@ParentPackage("custom")
11@Results({
12 @Result(name = ActionSupport.SUCCESS, type = "dispatcher", location="sports.jsp")
13})
14public class SportsAction extends ActionSupport {
15 .....
16}
@ParentPackage
を指定せずActionクラスごとにインターセプタを設定する方法もあります。そのときは@InterceptorRefs
を利用します。
java
1import org.apache.struts2.convention.annotation.Action;
2import org.apache.struts2.convention.annotation.InterceptorRef;
3import org.apache.struts2.convention.annotation.InterceptorRefs;
4import org.apache.struts2.convention.annotation.Namespace;
5import org.apache.struts2.convention.annotation.Result;
6import org.apache.struts2.convention.annotation.Results;
7
8import com.opensymphony.xwork2.ActionSupport;
9
10@Namespace("/sports")
11@InterceptorRefs({
12 @InterceptorRef("defaultStack"),
13 @InterceptorRef("token"),
14})
15@Results({
16 @Result(name = ActionSupport.SUCCESS, type = "dispatcher", location="sports.jsp")
17})
18public class SportsAction extends ActionSupport {
19 ....
20}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/17 06:52
2018/11/17 07:09
2018/11/19 02:48