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を参照する

struts.xml

        <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のJSPstruts.xmlの設定だけで、トランザクションTokenチェックが実装できた。Struts2は本当に良くできていると感心する。