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


(1)       フォームの重複した提出を避ける方法:
Ø  HttpServletRequest.sendRedirect()方法を用いてクライアントを成功ページにリダイレクトする.
Ø  クライアントでJavaScriptを通じて実現します.
Ø  サービスでコードを作成して実現します.
(2)       サーバ側でフォームの重複提出を避けるために、通常は同期トークンを用いて実装されるが、基本的な原理は以下の通りである.
(1)フォームを含むページにユーザがアクセスし、サーバ端は今回のセッションでSessionオブジェクトを作成し、トークン値を生成し、このトークン値を隠し入力ドメイン(<input>要素のtype属性がhidden)の値としてフォームとともにクライアントに送信し、トークン値をSessionに保存する.
(2)ユーザがページを提出し、サーバ端はまず要求パラメータにおけるトークン値とセッションに保存されているトークン値が等しいかどうかを判断する.[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<User> { 
  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. <body> 
  2.     <s:form action="token"
  3.         <s:textfield name="name" label=" "></s:textfield><br> 
  4.         <s:password name="password" label=" "></s:password><br> 
  5.         <s:token></s:token><br> 
  6.         <s:submit value=" "></s:submit><br> 
  7.     </s:form> 
  8.   </body> 
struts.xml
 

  
  
  
  
  1. <package name="token" extends="struts-default"> 
  2.         <action name="token" class="com.mzsx.token.TokenAction"> 
  3.             <result name="success">/s15/success.jsp</result> 
  4.             <result name="invalid.token">/s15/error.jsp</result> 
  5.             <interceptor-ref name="token"></interceptor-ref> 
  6.             <interceptor-ref name="defaultStack"></interceptor-ref> 
  7.         </action> 
  8.     </package>