→Struts関連
-[[Strutsトランザクショントークン>http://www.ne.jp/asahi/hishidama/home/tech/struts/ttoken.html]]
--表示する画面の中にhiddenでランダムなID(トークン)を埋め込んでおき、そのトークンをサーバー側でもセッション内に保持しておく。
--その画面でサブミットされると、hiddenに埋められていたトークンがリクエストに入れられてサーバーに届く。
--サーバーでは、届いたhiddenのトークンとセッション内に保持していたトークンを比較する。一致していれば正しい遷移と判断する。
--別の画面のhiddenには別のトークンが埋められている為、意図しない画面から来た場合はセッション内のトークンとは一致しないので 誤った遷移であると判断できる。
--比較直後にセッション内からトークンを削除しておけば、重複サブミットの二度目の処理を防止できる。
--つまり、連続してサブミットボタンが押されたような場合には同一のトークンが再び届くが、セッションのトークンは既に存在しないので一致しない。すなわち不正なサブミットだと判断できる。
-org.apache.struts.util.TokenProcessor というシングルトンなクラスを使う
-実装手順(SAStrutsの場合)
--アクションクラスでリクエストを触れるようにしておく
@Resource
protected HttpServletRequest request;
--ページのindex()などでセッションにトークンをセーブします。
TokenProcessor.getInstance().saveToken(request);
--jspは修正する必要がありません(※)
--チェックしたいタイミングでこのようにチェックする
if( TokenProcessor.getInstance().isTokenValid(request, true) ==false){
//戻るボタンによる二度押しされたときのエラー処理
addGlobalMessage(MessageId.W_TRANSACTION_TOKEN_ERROR);
...(適切な画面に遷移など)
}
--チェックとは、セッションに保存したトークンとjspからリクエストに渡されたトークンがマッチするかをチェックしています。これがfalseで帰ってきたら、戻るボタンで戻って二度目のsubmitで来たということです。チェックしたあとトークンをsessionから消すなら第二引数をtrueにします。通常はtrue。
-※本来ならばjspファイルのほうで、
<form id="form">
<input type="hidden" id="token" name="org.apache.struts.taglib.html.TOKEN" .../>
...
</form>
としておく必要がありますが、セッションにトランザクショントークンがセーブしてあるとStrutsが自動的にinputタグを差し込んでくれます。
-[[参考ページ1>http://f13.aaa.livedoor.jp/~itiit/wiki/pukiwiki.php?%5B%5BStruts%2F%B4%F0%C1%C3%5D%5D]]
-[[参考ページ2>http://www.masatom.in/pukiwiki/Struts/%C6%B1%B4%FC%A5%C8%A1%BC%A5%AF%A5%F3%A4%C7%C6%F3%C5%D9%B2%A1%A4%B7%A4%CA%A4%C9%A4%F2%A5%C1%A5%A7%A5%C3%A5%AF%A4%B9%A4%EB/]]