Tokenページ重複コミット防止
どこか間違ったところがあったら、皆さんに指摘してもらいたいです.
操作:
1.以前のプロジェクトでは、コミット後、メンテナンスページに戻るため、コミット後、後退するのではなく、リフレッシュし続けると、最初のコミット操作が行われていました.
2.メンテナンスページに戻ってソースコードを見ると、なぜ新しく生成された「32ビットランダムコード」がページの非表示ドメインで変わったのか、提出するときは、初めての「32ビットランダムコード」を出力するのか、非表示ドメインのコードは確かに変わったが、提出するのはあなたがもう一度クリックした「提出ボタン」動作ではなく、初めて提出する動作なので、リフレッシュは最初にコミットされたアクションを実行します
注意:
1.token.jspはhtml:formラベルを使用する必要があります
覚えておいてください.StrutsはActionにアクセスするたびにトークンを生成し、セッションに保存します.Actionの関数にsaveToken(request)を使用している場合は、このトークンは、このActionがForwardからのjspが生成した静的ページにも保存されます.
ActionのメソッドでisTokenValidを使用すると、Strutsはあなたのrequestからこのトークン値を取得し、Sessionのトークン値と比較します.両者が等しい場合は、重複コミットではなく、等しくない場合は、重複コミットです.
もちろん、actionが継承した親クラスでフォームの重複コミットを制御することもできます.これにより、すべてのサブクラスに重複コミットを防ぐコードを別々に書く必要がなくなります.
index.jsp
token.jsp
struts-config.xml
ポイントは2つです.
1.ページにジャンプするクラスでsaveToken(HttpServeretRequest request)メソッドを呼び出す
2.ページの呼び出し先クラスの追加方法でisTokenValid(H ttpServeretRequest request,boolean arg 1)メソッドを呼び出す
操作:
1.以前のプロジェクトでは、コミット後、メンテナンスページに戻るため、コミット後、後退するのではなく、リフレッシュし続けると、最初のコミット操作が行われていました.
2.メンテナンスページに戻ってソースコードを見ると、なぜ新しく生成された「32ビットランダムコード」がページの非表示ドメインで変わったのか、提出するときは、初めての「32ビットランダムコード」を出力するのか、非表示ドメインのコードは確かに変わったが、提出するのはあなたがもう一度クリックした「提出ボタン」動作ではなく、初めて提出する動作なので、リフレッシュは最初にコミットされたアクションを実行します
注意:
1.token.jspはhtml:formラベルを使用する必要があります
覚えておいてください.StrutsはActionにアクセスするたびにトークンを生成し、セッションに保存します.Actionの関数にsaveToken(request)を使用している場合は、このトークンは、このActionがForwardからのjspが生成した静的ページにも保存されます.
ActionのメソッドでisTokenValidを使用すると、Strutsはあなたのrequestからこのトークン値を取得し、Sessionのトークン値と比較します.両者が等しい場合は、重複コミットではなく、等しくない場合は、重複コミットです.
もちろん、actionが継承した親クラスでフォームの重複コミットを制御することもできます.これにより、すべてのサブクラスに重複コミットを防ぐコードを別々に書く必要がなくなります.
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<html:link action="token.do?method=token">Token</html:link>
</body>
</html>
TokenAction.java
public class TokenAction extends DispatchAction {
public ActionForward token(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
TokenForm tokenForm = (TokenForm) form;
//saveToken , ,
this.saveToken(request);
return mapping.findForward("token");
}
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
TokenForm tokenForm = (TokenForm) form;
// ,
if(isTokenValid(request,true)){
System.out.println(" ");
this.resetToken(request);
}else{
System.out.println(" ");
//
this.saveToken(request);
return mapping.getInputForward();
}
return mapping.findForward("token");
}
}
token.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<html>
<head>
<title>JSP for TokenForm form</title>
</head>
<body>
<html:form action="/token.do?method=add">
, value "32 <br>
: <html:password property="username"/><br/>
: <html:text property="password"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans >
<form-bean name="tokenForm" type="com.dahai.struts.form.TokenForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="tokenForm"
input="/token.jsp"
name="tokenForm"
parameter="method"
path="/token"
scope="request"
type="com.dahai.struts.action.TokenAction" >
<forward name="token" path="/token.jsp"/>
</action>
</action-mappings>
<message-resources parameter="com.dahai.struts.ApplicationResources" />
</struts-config>
ポイントは2つです.
1.ページにジャンプするクラスでsaveToken(HttpServeretRequest request)メソッドを呼び出す
2.ページの呼び出し先クラスの追加方法でisTokenValid(H ttpServeretRequest request,boolean arg 1)メソッドを呼び出す