Struts関連

  • Strutsトランザクショントークン
    • 表示する画面の中に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タグを差し込んでくれます。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-10 (火) 22:40:37 (4196d)