サーブレット属性に関するもの
ここで紹介するインターセプタは、サーブレット属性(リクエスト属性、セッション属性)に対して変更や利便性を向上する機能を提供してくれます。
(1)Cookie Interceptor
Cookieの値をMap型のフィールドへ自動的に格納します。Actionクラスで使う場合には、次のルールに従います。
- Cookie Interceptorの利用を宣言する
- CookieAwareインターフェイスを実装する
注意点としては、Cookieの参照のみが行えることです。ブラウザのCookieを更新する処理はこのインターセプタでは行えません。Cookieを更新する場合にはブラウザに対してレスポンスを返さなければいけないので、Struts 2ではHttpServletResponseを取得できるResponseAwareも実装します。
では、Cookieを参照・更新する具体的な方法について、サンプルを見てみましょう。
@Namespace(value="/cookie")
@ParentPackage(value="struts-default")
@InterceptorRefs({
// Cookie Interceptorの設定 … (A)
@InterceptorRef(value="cookie" ,
params={"cookiesName", "sampleCookie,addCookie" ,
"cookiesValue" , "*"}),
// デフォルト定義インターセプタ群
@InterceptorRef("defaultStack"),
})
@Results({
@Result(name="success" , location="success.jsp"),
})
public class CookieSampleAction extends ActionSupport implements CookiesAware ,ServletResponseAware{
public static final Logger log = Logger.getLogger(CookieSampleAction.class);
@Action("start")
public String start() throws Exception {
return "success";
}
/**
* 実行メソッド。
*/
@Action("execute")
public String execute() throws Exception {
// 現在のクッキーをログへ出力
log.debug("cookie:" + cookie);
// リクエストパラメータからの値をクッキーMapへバインド
// ※Mapへバインドしても出力されるクッキーへ影響がないことの確認
cookie.put("cookie2", "map add value.");
// クッキーを生成し、HTTPレスポンスへ出力
Cookie newCookie = new Cookie("addCookie", (new Date()).toString() );
response.addCookie(newCookie);
Cookie newCookie2 = new Cookie("sampleCookie" , sampleCookie);
response.addCookie(newCookie2);
return "success";
}
/**
* 現在のクッキーをMapで取得。
* ※CookiesAware必須実装。
*/
@SuppressWarnings("unchecked")
public void setCookiesMap(Map cookie) {
this.cookie = cookie;
}
private Map<String,Object> cookie;
/**
* サーブレットレスポンスのインスタンスを取得。
* ※ServletAware必須実装。
*/
public void setServletResponse(HttpServletResponse httpservletresponse) {
this.response = httpservletresponse;
}
private HttpServletResponse response;
}
CookieAwareを実装することで、Cookieの値をActionクラスのフィールドとして扱え、ブラウザのCookieを取得できます。Cookieをブラウザへ出力する場合には、ResponseAwareを実装することで、HttpServletResponseもActionクラスのフィールドとして扱うことができ、response.addCookie( newCookie )でCookieを出力できます。なお、Cookie Interceptorの設定は、アノテーションで設定されているリスト1の(A)の部分になります。
今回もアノテーションを使ったインターセプタの定義を行っています。ちなみに、アノテーションでインターセプタを扱う場合には、インターセプタごとに定められた固有のパラメータを設定して操作をします。パラメータはparamsで指定し、その指定方法は「項目名、値、項目名、値・・・」の順序で記述していきます。
今回の例では、cookiesNameの後の値で、Actionクラスで扱うCookieの名前をカンマつなぎで列挙し、cookiesValueの後の値で、取り扱うCookieの値を指定します。アスタリスク "*" ですべての値として省略も可能です。上記の例の場合、取り扱うCookieは、sampleCookie、addCookieの2つの値で、値に関しては"*"で指定されているので制限はありません。またcookiesValueに"*"以外の値を設定して、特定の値のときのみ参照するといったこともできます。
では、サンプルを稼動させてみましょう。http://127.0.0.1:8080/interceptors/cookie/execute.actionを起動すると次の画面が表示されます。

テキストボックスに半角英数で値を入力し[Cookie記録]ボタンを押します。するとCookieが出力されるので、実際にブラウザのCookieを確認してみましょう。

図2のように、先ほど入力した値がCookieへ格納されていることを確認できます。
