Struts/同期トークンで二度押しなどをチェックする
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
WEB開発で必ずついて回るのが、Submitボタン二度押しや戻るボ...
実際にサンプルで、ある画面でSubmitを二度押ししたとき、そ...
**同期トークンとは [#n88a5573]
同期トークンの機能とは以下の通りです。
+あるアクションで、サーバ上でユニークなID(以下、トークン)...
+そのアクションで、トークンはSessionにも格納しておく
+次のリクエストにはhidden内のトークンが飛んでくる
+次のアクションで、hiddenパラメタ内のトークンとSessionの...
+等しければ、正しいリクエストということで処理する。Sessio...
+以下繰り返し。
この中で、トークンの生成、トークンチェック、hiddenにトー...
**やってみる [#ee906f33]
***流れ [#c64313a1]
index.do -> IndexAction -> index.jsp -> double.do -> Dou...
という流れのサンプルです。
***ソース [#c08839fb]
-IndexAction
public ActionForward execute(ActionMapping mapping, Acti...
HttpServletRequest request, HttpServletResponse resp...
throws Exception {
saveToken(request);
return mapping.findForward("success");
}
-index.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http:...
<%@ page language="java" contentType="text/html; charset...
<%@ taglib uri="http://struts.apache.org/tags-bean" pref...
<%@ taglib uri="http://struts.apache.org/tags-html" pref...
<%@ taglib uri="http://struts.apache.org/tags-logic" pre...
<%@page import="org.apache.struts.Globals"%>
<html:html xhtml="true" lang="true">
<head>
<title>同期トークンの稼動確認JSP</title>
<meta http-equiv="Content-Type" content="application/xht...
<html:base />
</head>
<body>
<html:form method="post" action="/double" >
<html:submit />
</html:form>
<%=session.getAttribute(Globals.TRANSACTION_TOKEN_KEY) %>
</body>
</html:html>
-DoubleAction
public ActionForward execute(ActionMapping mapping, Acti...
HttpServletRequest request, HttpServletResponse res...
throws Exception {
ActionMessages errors = new ActionMessages();
HttpSession session = request.getSession();
boolean tokenValid = false;
synchronized (session) {
tokenValid = isTokenValid(request);
saveToken(request);
}
if (!tokenValid) {
StringBuffer buffer = new StringBuffer();
buffer.append("tokenチェックエラー");
errors.add(ActionMessages.GLOBAL_MESSAGE, new Action...
new String(buffer), false));
saveErrors(request, errors);
}
}
***セッションにトークンをセット [#n9e5325d]
IndexActionでSessionにトークンをセットしています。トーク...
org.apache.struts.action.Action#saveToken
です((中ではsessionIdをMD5でハッシュして、更に現在時刻で...
***JSPのhiddenにトークンをセット [#m937a884]
index.jspではformを使ってSubmitしていますが、出力されるht...
<html:form method="post" action="/double" >
<html:submit />
</html:form>
としているだけなのですが出力されるhtmlは
<form id="hogeForm" method="post" action="/strutsExample...
<div><input type="hidden" name="org.apache.struts.tagl...
value="612326e14b3ce599284543e2246f170b" /></div>
<input type="submit" value="Submit" />
</form>
となります。あるキー値でhiddenにトークンがセットされてい...
***次のリクエストで、サーバでトークンのチェック [#k368ed90]
さてこれでsessionにトークンがセットされ、さらにhtmlのhidd...
synchronized (session) {
tokenValid = isTokenValid(request);
saveToken(request);
}
if (!tokenValid) {
StringBuffer buffer = new StringBuffer();
buffer.append("tokenチェックエラー");
errors.add(ActionMessages.GLOBAL_MESSAGE, new Action...
new String(buffer), false));
saveErrors(request, errors);
}
となっています。
isTokenValid(request);
がSessionのトークンとhiddenのトークンをチェックするメソッ...
saveToken(request);
で再度トークンを書き換えています。
isTokenValid(request)はスレッドセーフですが、トークンを変...
**Formでなく<html:link />の場合 [#e1cadcc0]
上の例のように<html:form />タグの場合は自動でhiddenタグが...
<html:link action="/double" transaction="true">リンク</h...
としてtransaction属性をtrueに指定します。transaction属性...
http://localhost:8080/strutsExamples/double.do
?org.apache.struts.taglib.html.TOKEN=f8e8901ab4cc126a1...
とパラメタにトークンが設定されます。ちなみにこのtransacti...
**サンプル。 [#kf462253]
-[[サンプルプログラム(ViewVC)>http://www.masatom.in/cgi-b...
-[[サンプルプログラム(Subversion)>https://www.masatom.in/...
この記事は
#vote(おもしろかった[276],そうでもない[37])
- その他のリンク系のタグは、rewriteタグがありますね。これ...
- メイン画面と別にサブウィンドウでも更新する画面の場合っ...
- auztxyMoZWaQ -- [[dzpntfpgxt]] &new{2012-07-16 (月) 10:...
- test1 -- [[test]] &new{2015-07-15 (水) 09:11:21};
- 初めまして。下記の場合はどのようにすれば良いのでしょう...
- 初めまして。フォームから送信した人に、期間限定のリンク...
- 初めまして。フォームから送信した人に、期間限定のリンク...
- 初めまして。下記の場合はどのようにすれば良いのでしょう...
- 初めまして。フォームから送信した人に、期間限定のリンク...
- 初めまして。フォームから送信した人に、期間限定のリンク...
- ds -- &new{2017-02-22 (水) 14:59:59};
- ds -- [[ddd]] &new{2017-02-22 (水) 15:00:15};
- ああ -- &new{2018-03-15 (木) 11:05:11};
- ああ -- &new{2018-03-15 (木) 11:05:11};
- ああ -- [[ああ]] &new{2018-03-15 (木) 11:05:14};
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- a -- [[a]] &new{2020-06-15 (月) 10:27:38};
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
WEB開発で必ずついて回るのが、Submitボタン二度押しや戻るボ...
実際にサンプルで、ある画面でSubmitを二度押ししたとき、そ...
**同期トークンとは [#n88a5573]
同期トークンの機能とは以下の通りです。
+あるアクションで、サーバ上でユニークなID(以下、トークン)...
+そのアクションで、トークンはSessionにも格納しておく
+次のリクエストにはhidden内のトークンが飛んでくる
+次のアクションで、hiddenパラメタ内のトークンとSessionの...
+等しければ、正しいリクエストということで処理する。Sessio...
+以下繰り返し。
この中で、トークンの生成、トークンチェック、hiddenにトー...
**やってみる [#ee906f33]
***流れ [#c64313a1]
index.do -> IndexAction -> index.jsp -> double.do -> Dou...
という流れのサンプルです。
***ソース [#c08839fb]
-IndexAction
public ActionForward execute(ActionMapping mapping, Acti...
HttpServletRequest request, HttpServletResponse resp...
throws Exception {
saveToken(request);
return mapping.findForward("success");
}
-index.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http:...
<%@ page language="java" contentType="text/html; charset...
<%@ taglib uri="http://struts.apache.org/tags-bean" pref...
<%@ taglib uri="http://struts.apache.org/tags-html" pref...
<%@ taglib uri="http://struts.apache.org/tags-logic" pre...
<%@page import="org.apache.struts.Globals"%>
<html:html xhtml="true" lang="true">
<head>
<title>同期トークンの稼動確認JSP</title>
<meta http-equiv="Content-Type" content="application/xht...
<html:base />
</head>
<body>
<html:form method="post" action="/double" >
<html:submit />
</html:form>
<%=session.getAttribute(Globals.TRANSACTION_TOKEN_KEY) %>
</body>
</html:html>
-DoubleAction
public ActionForward execute(ActionMapping mapping, Acti...
HttpServletRequest request, HttpServletResponse res...
throws Exception {
ActionMessages errors = new ActionMessages();
HttpSession session = request.getSession();
boolean tokenValid = false;
synchronized (session) {
tokenValid = isTokenValid(request);
saveToken(request);
}
if (!tokenValid) {
StringBuffer buffer = new StringBuffer();
buffer.append("tokenチェックエラー");
errors.add(ActionMessages.GLOBAL_MESSAGE, new Action...
new String(buffer), false));
saveErrors(request, errors);
}
}
***セッションにトークンをセット [#n9e5325d]
IndexActionでSessionにトークンをセットしています。トーク...
org.apache.struts.action.Action#saveToken
です((中ではsessionIdをMD5でハッシュして、更に現在時刻で...
***JSPのhiddenにトークンをセット [#m937a884]
index.jspではformを使ってSubmitしていますが、出力されるht...
<html:form method="post" action="/double" >
<html:submit />
</html:form>
としているだけなのですが出力されるhtmlは
<form id="hogeForm" method="post" action="/strutsExample...
<div><input type="hidden" name="org.apache.struts.tagl...
value="612326e14b3ce599284543e2246f170b" /></div>
<input type="submit" value="Submit" />
</form>
となります。あるキー値でhiddenにトークンがセットされてい...
***次のリクエストで、サーバでトークンのチェック [#k368ed90]
さてこれでsessionにトークンがセットされ、さらにhtmlのhidd...
synchronized (session) {
tokenValid = isTokenValid(request);
saveToken(request);
}
if (!tokenValid) {
StringBuffer buffer = new StringBuffer();
buffer.append("tokenチェックエラー");
errors.add(ActionMessages.GLOBAL_MESSAGE, new Action...
new String(buffer), false));
saveErrors(request, errors);
}
となっています。
isTokenValid(request);
がSessionのトークンとhiddenのトークンをチェックするメソッ...
saveToken(request);
で再度トークンを書き換えています。
isTokenValid(request)はスレッドセーフですが、トークンを変...
**Formでなく<html:link />の場合 [#e1cadcc0]
上の例のように<html:form />タグの場合は自動でhiddenタグが...
<html:link action="/double" transaction="true">リンク</h...
としてtransaction属性をtrueに指定します。transaction属性...
http://localhost:8080/strutsExamples/double.do
?org.apache.struts.taglib.html.TOKEN=f8e8901ab4cc126a1...
とパラメタにトークンが設定されます。ちなみにこのtransacti...
**サンプル。 [#kf462253]
-[[サンプルプログラム(ViewVC)>http://www.masatom.in/cgi-b...
-[[サンプルプログラム(Subversion)>https://www.masatom.in/...
この記事は
#vote(おもしろかった[276],そうでもない[37])
- その他のリンク系のタグは、rewriteタグがありますね。これ...
- メイン画面と別にサブウィンドウでも更新する画面の場合っ...
- auztxyMoZWaQ -- [[dzpntfpgxt]] &new{2012-07-16 (月) 10:...
- test1 -- [[test]] &new{2015-07-15 (水) 09:11:21};
- 初めまして。下記の場合はどのようにすれば良いのでしょう...
- 初めまして。フォームから送信した人に、期間限定のリンク...
- 初めまして。フォームから送信した人に、期間限定のリンク...
- 初めまして。下記の場合はどのようにすれば良いのでしょう...
- 初めまして。フォームから送信した人に、期間限定のリンク...
- 初めまして。フォームから送信した人に、期間限定のリンク...
- ds -- &new{2017-02-22 (水) 14:59:59};
- ds -- [[ddd]] &new{2017-02-22 (水) 15:00:15};
- ああ -- &new{2018-03-15 (木) 11:05:11};
- ああ -- &new{2018-03-15 (木) 11:05:11};
- ああ -- [[ああ]] &new{2018-03-15 (木) 11:05:14};
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- ssssss -- [[ssss]] &new{2019-12-21 (土) 16:33...
- a -- [[a]] &new{2020-06-15 (月) 10:27:38};
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: