STRUTSでは同期トークン(Token)を用いて重複コミットの問題を解決する


場合によっては、ユーザーがHTMLフォームを繰り返しコミットする場合、Webアプリケーションは、ユーザーの繰り返しコミット行為を判断して、対応する処理を行う必要があります.
Strutsは参照実装を与えた.org.apache.struts.action.Actionクラスでは、Tokenに関連する一連の方法が提供されています.
  • protected boolean isTokenValid(javax.servlet.http.HttpServletRequest request)

  • 現在のユーザセッションに格納トークン値と要求パラメータのトークン値が一致するか否かを判断し、一致する場合はtrueを返し、そうでない場合はfalseを返す.
        2.   protected void resetToken(javax.servlet.http.HttpServletRequest request)
    現在のセッションからトークン値を削除します.
       3.    protected void saveToken(javax.servlet.http.HttpServletRequest request)
    新しいトークンを作成し、セッションの範囲内に保存します.
     
    ヒント:具体的なToken処理ロジックはorg.apache.struts.util.TokenProcesorクラスが完成したので、このクラスの処理ロジックを逆コンパイルして見ることができます.そのgenerateToken(request)メソッドは、ユーザセッションIDと現在のシステム時間とに基づいて一意のトークン値を生成する.
    プロセス:
    例えば、登録プロセスは、ユーザが登録ページを要求する前に、この登録ページにActionから転送され、このActionにsaveToken(request)メソッドを加えてTokenを作成し、sessionに保存する.そして登録ページに転送します.登録ページのタグの処理クラスではセッションにTokenが存在するか否かが判断され,存在する場合はフォームに隠しドメインが生成され,隠しドメインの値はStrutsのTokenメカニズムを用いて算出される値である.ユーザが登録ページを受信すると、FORMフォームに存在するTokenの非表示ドメインが発見される.ユーザが登録情報を別のActionにコミットした場合、このActionではisTokenValid(request)を用いて重複コミットであるか否かを判断し、ユーザが初めてフォームをコミットしてtrueを返す場合、ユーザがブラウザを介してボタンを返すと、ページに戻って再びコミットするとfalseに戻る.エラー処理を行います.
     
    例:Action 1:
    public class RegAction extends Action{public ActionForward execute(ActionMapping mapping,ActionForm,HttpServeretRequest request,HttpServeretResponse response){//メソッドを呼び出してToken saveToken(request);//TODO Auto-generated method stub return mapping.findForward("register");}
     
     
     
    Action 1はJSPページに転送されます.
     
    Submit
      
    ここでTokenの非表示ドメインが自動的に生成されます.

      
    Action 2:jspページ提出要求
    if(!isTokenValid){System.out.println("TokenActionを繰り返しコミット");saveToken(request);return(new ActionForward(mapping.getInput()));Else{resetToken(request);System.out.println(「Token!TokenActionの再設定」);
     
     
     
    重複コミットであるか否かを判断する、重複コミットであればデフォルトstruts-configに転送する.xmlでAction 2に設定されているエラーページで、Tokenを再作成します.繰り返しコミットでなければ現在のセッションからTokenを削除する.
     
    OK、これです.もしあなたのアプリケーションでエラーページを返すことができたら、filterにTokenなどの方法を適用することもできます.strutsのjarパッケージを逆コンパイルして、自分のクラスに持って行って使う必要があります.