Struts 2.xフォームの重複提出を避ける——Token


(1)       フォームの重複した提出を避ける方法:
Ø  HttpServletRequest.sendRedirect()方法を用いてクライアントを成功ページにリダイレクトする.
Ø  クライアントでJavaScriptを通じて実現します.
Ø  サービスでコードを作成して実現します.
(2)       サーバ側でフォームの重複提出を避けるために、通常は同期トークンを用いて実装されるが、基本的な原理は以下の通りである.
(1)フォームを含むページにユーザがアクセスし、サーバ端はこのセッションでSessionオブジェクトを作成し、トークン値を生成し、このトークン値を隠し入力ドメイン(要素のtype属性がhidden)の値としてフォームとともにクライアントに送信し、同時にトークン値をSessionに保存する.
(2)ユーザがページを提出すると、サーバ端はまず要求パラメータの中のトークン値とSessionに保存されているトークン値が等しいかどうかを判断し、等しい場合はSessionの中のトークン値を除いてデータ処理を実行する.同じでない場合は、ユーザにテーブルを提出し、同時に新しいトークン値を作成してSessionに保存するように促す.ユーザがサブミット数にアクセスする.ページによると、新たに生成されたトークン値を隠し入力ドメインの値として使用する.
(3)       Struts 2の実現方式:
(1)フォームにタグを使用して、トークンの名前を並べて置く必要があります.例えば、
(2)アクションのための設定アプリケーションTokenInterceptorまたはTokenSession StreInterceptorブロックは、この2つのブロックはすでにstruts-default.xmlで定義されていますが、defaultブロックスタックには含まれていません.
 
例:フォームの重複提出を避ける
 
TokenAction.java:
 
 
   
   
   
   
  1. import com.opensymphony.xwork2.ActionSupport; 
  2. import com.opensymphony.xwork2.ModelDriven; 
  3. public class TokenAction extends ActionSupport implements ModelDriven { 
  4.     private static final long serialVersionUID = 7502909137522615270L; 
  5.     private User user=new User(); 
  6.     @Override 
  7.     public User getModel() { 
  8.         return user; 
  9.     } 
  10.     @Override 
  11.     public String execute() throws Exception { 
  12.         if ("qiang".equalsIgnoreCase(user.getName())&&"1234".equals(user.getPassword())) { 
  13.             return SUCCESS; 
  14.         } else { 
  15.             return ERROR; 
  16.         } 
  17.     } 
 
User.java:
 
 
   
   
   
   
  1. public class User { 
  2.     private String name; 
  3.     private String password; 
  4.     // getter setter  
 
token login.jsp:
   
   
   
   
  1.  
  2.     
    "token"
  3.         "name" label=" ">
     
  4.         "password" label=" ">
     
  5.         
     
  6.         " ">
     
  7.      
  8.    
struts.xml
 
   
   
   
   
  1. <package name="token" extends="struts-default"> 
  2.         <action name="token" class="com.mzsx.token.TokenAction"> 
  3.             <result name="success">/s15/success.jspresult> 
  4.             <result name="invalid.token">/s15/error.jspresult> 
  5.             <interceptor-ref name="token">interceptor-ref> 
  6.             <interceptor-ref name="defaultStack">interceptor-ref> 
  7.         action> 
  8.     package>