Struts 2.xフォームの重複提出を避ける——Token
7967 ワード
(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:
User.java:
token login.jsp:
Ø 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:
- import com.opensymphony.xwork2.ActionSupport;
- import com.opensymphony.xwork2.ModelDriven;
- public class TokenAction extends ActionSupport implements ModelDriven
{
- 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:
-
- >
-
"name" label=" ">
-
"password" label=" ">
-
-
" " >
-
-
struts.xml
- <package name="token" extends="struts-default">
- <action name="token" class="com.mzsx.token.TokenAction">
- <result name="success">/s15/success.jspresult>
- <result name="invalid.token">/s15/error.jspresult>
- <interceptor-ref name="token">interceptor-ref>
- <interceptor-ref name="defaultStack">interceptor-ref>
- action>
- package>