Struts 2.xフォームの重複提出を避ける――Token
8042 ワード
(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:
User.java:
token login.jsp:
Ø 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:
- import com.opensymphony.xwork2.ActionSupport;
- import com.opensymphony.xwork2.ModelDriven;
- public class TokenAction extends ActionSupport implements ModelDriven<User> {
- private static final long serialVersionUID = 7502909137522615270L;
- private User user=new User();
- @Override
- public User getModel() {
- return user;
- }
- @Override
- public String execute() throws Exception {
- if ("qiang".equalsIgnoreCase(user.getName())&&"1234".equals(user.getPassword())) {
- return SUCCESS;
- } else {
- return ERROR;
- }
- }
- }
User.java:
- public class User {
- private String name;
- private String password;
- // getter setter
- }
token login.jsp:
- <body>
- <s:form action="token">
- <s:textfield name="name" label=" "></s:textfield><br>
- <s:password name="password" label=" "></s:password><br>
- <s:token></s:token><br>
- <s:submit value=" "></s:submit><br>
- </s:form>
- </body>
struts.xml
- <package name="token" extends="struts-default">
- <action name="token" class="com.mzsx.token.TokenAction">
- <result name="success">/s15/success.jsp</result>
- <result name="invalid.token">/s15/error.jsp</result>
- <interceptor-ref name="token"></interceptor-ref>
- <interceptor-ref name="defaultStack"></interceptor-ref>
- </action>
- </package>