(4)Prepare Interceptor
このインターセプタを使うと、Actionクラスのexecute()メソッドを実行する前の処理をprepare()メソッドで記述することができます。他に利用しているインターセプタとの兼ね合いもありますので、リクエストパラメータやサーブレット属性の修正については慎重に行う必要があります。また、Actionクラスの実行メソッドがexecute以外にもある場合には、常に接頭辞としてprepareをつけることで同様に前処理を実装することができます。
例えば、search()メソッドはprepareSearch()メソッドになります。
@Namespace(value="/prepare")
@ParentPackage(value="struts-default")
@InterceptorRefs({
@InterceptorRef("defaultStack") ,
})
@Results({
@Result(name="success" , location="success.jsp"),
})
/**
* Preparable実装サンプル。実行メソッドexecute()の前処理を行う箇所をprepare()で提供される。
*/
public class PrepareSampleAction extends ActionSupport implements Preparable {
private static Logger log = Logger.getLogger(PrepareSampleAction.class);
/**
* execute()の前処理をここに実装。
*/
public void prepare() throws Exception {
log.debug("*prepare*");
addActionMessage("prepare()を通過しました");
}
@Action("execute")
public String execute() throws Exception {
log.debug("+execute+");
addActionMessage("execute()を通過しました");
return "success";
}
/**
* other()の前処理をここに実装。
*/
public void prepareOther() throws Exception {
log.debug("*prepareOther*");
addActionMessage("prepareOther()を通過しました");
}
@Action("other")
public String other() throws Exception {
log.debug("+other+");
addActionMessage("other()を通過しました");
return "success";
}
}
それではサンプルを使って確認をします。
ブラウザから「http://127.0.0.1:8080/interceptors/prepare/execute.action」を表示します。すると次の画面が出ます。

この画面ではexecute()メソッドが起動されますので、PrepareInterceptorによってprepare()が起動されてから、execute()を起動されます。画面上部のメッセージ部分で、Actionクラスのメソッド内で出力しているメッセージが表示されています。
では、画面内のリンクにある「other()アクションを起動する」リンクをクリックしてother()メソッドを起動してみましょう。その結果は次のようになります。

このように、Actionクラス内のメソッドが起動する前にprepareから始まるメソッドが起動されていることがわかります。
注意点としては、prepare****()メソッドが実行された後、prepare()が実行されることです。1つのActionで複数のActionメソッドを実装する場合にはなるべくexecute()、prepare()での実装は避けておきましょう。
(5)Token Interceptor
リクエストごとに発行される一時トークンをチェックし、合致しなければActionが起動されずにresult値はinvalid.tokenを返します。TokenInterceptorは同一セッションからの複数のリクエストをブロックすることができます。遷移チェック用の一時トークンはJSPにて<s:token />を記述するだけで利用することができます。なお、invalid.tokenの遷移先の画面はそれぞれのActionか、または共通で1つは設定しなければなりません。
なお、遷移チェックでエラーを検出した場合のメッセージはstruts.messages.invalid.tokenで出力するようメッセージIDが固定されています。このメッセージIDはメッセージ用プロパティなどに登録しておけばその内容が表示されます。
サンプルアプリケーションでは、commons.propertiesで
struts.messages.invalid.token=不正な画面遷移を検出しました。
のように設定しています。
