Webで2度押しとか、他のページに行かないようにする方法として
Strutsの場合
(1)トランザクショントークンを使う
(2)(Strutsに限らないが)javascriptで対応する
・2度押し:ボタンをdisableにする
・他のページにいかないようにする:unloadで自分の画面以外に行かなくさせる
の2種類の対応が考えられる。
■(1)の場合、
・actionクラスのexecuteメソッドにおいて、
はじめに
saveToken(request);
をしておくと、その後のJSPのhtml:formタグ内に、トランザクショントークンが
書き込まれる。
次の画面で、isTokenValid(request,true)すると、
セッションにはいっている、トークンと、画面からきた(JSPで書き出した)
トランザクショントークンと比較する。
前の画面から直接来たのなら、セッションのものと一致するのでOK
他の画面からくると、一致しないのでエラーになるというもの。
■(2)の場合、
2度押し防止は、ボタンの.disabled = trueにして、ボタン自体を押せなくする。
でも、これだと、ブラウザの「戻る」で戻すとき、前の画面に戻れてしまうので、
それを抑止するため、
Javascriptで、
<script type="text/javascript"> <!-- var i = 1; function nextModoru() { if ( i == 1) { alert("ほかの画面にはいけません"); window.open("いまのページ","_top"); } } function nextJump() { i = 0; window.open("つぎに遷移するページ","_top"); } //--> </script> </HEAD> <BODY onunload="nextModoru()"> <INPUT TYPE="BUTTON" onClick="nextJump()" value="つぎへ"> |
(<>は、本当は半角)
などとする。こうすると、読み込み時、i=1にセットされているため、
ボタンをクリックされて、nextJumpを使わないかぎり、i=0にならない。
つまり、ボタンを押さないで他の画面に行こうとすると、i=1のままで、
nextModoruが、遷移しようとしたときに実行され、
結果、今のページが再描画される。
これ以外にも、locationをいじって、ダミー画面を入れるとか、
いろいろあるみたいだけど・・・
■問題は・・・
Javascriptの場合、画面遷移しない。だから、問題ない。
しかし、トランザクショントークンでやった場合、
「ほかの画面からきました」
「2度押しされました」
というメッセージを出すのはいいんだけど、このあと、どこに遷移したら、いいんでしょうねえ・・
2度押しされました。。。ってメッセージだして、
前の画面にもどっても、いや、その画面押されてるわけで・・・
みたいな・・・
そんなこんなかんがえると、他画面遷移抑止、
トランザクショントークンより、Javascriptのほうが、早くね?
(はやいかどうかっていう問題じゃないか・・・?)