TokenInterceptorの使い方
色々便利なInterceptorが標準装備のStruts2だが、WEBで一般的な問題の2重ポストについて、トランザクションTokenによる防止機構が用意されている。
Tokenの仕組みは簡単に言うと、FORMにHIDDENで仕込んだTokenとセッションの保持している値との比較を行い、一度だけActionの実行を許すものである。
2重POSTを禁止したいFORMで次のようにTokenを仕込む
<s:form action="user_add"> <s:token/> : </s:form>
そして、user_addのアクション側で次のようにTokenInterceptorを参照する
<action name="user_add" class="UserAction" method="doAdd"> <interceptor-ref name="token"> <param name="includeMethods">*</param> </interceptor-ref> <interceptor-ref name="transactauth_chk"/> <result type="redirect-action">user_list</result> <result name="input">/edit.jsp</result> <result name="invalid.token" type="redirect-action">user_new</result> </action>
Tokenのチェックで一致しなかった場合 result に invalid.token が返るので、適切なページを表示するようにすればいい。
FORMのJSPとstruts.xmlの設定だけで、トランザクションTokenチェックが実装できた。Struts2は本当に良くできていると感心する。