→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/]]


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS