2012年9月10日月曜日

strutsのトークンでの二度押し処理について

strutsは不正遷移の防止の為に
トランザクショントークンという仕組みを持っている。
んで気になったこと。

トランザクショントークンを使った不正遷移のチェックは
画面を表示するときにセッションと画面の項目(hidden)に
同じ値(トークン)を設定しておく。
ボタンが押されたきにアクションで
画面から送られたトークンがセッションに保存したものと一致する場合は正常、
(通常は一致確認後セッションからトークンを削除するか
新しくトークンを発行して保存する。)
一致しない場合は不正遷移としてエラーとする。

ここまではいいんだけど、これを二度押し防止に使った場合に
最初のリクエストではトークンが一致するから正常として
(通常トークンは削除または再発行される) 次の画面へ遷移しようとする。
その後、二度押しされた場合の二回目のリクエストでは
最初のリクエストで既にトークンが変わっているからトークン不一致でエラーとなる。
それでエラー画面へ遷移しようとする。だけど初回のリクエストは正しいので
二回目のリクエストは無視して次の画面へ遷移するのが正解だろうな。
その判断はどうするんだろう。
そもそも不正遷移と二度押しの判断てどうするんだろう。。。


おそらくトークンは二度押し判断には使ってはいけないんだろうな。
(というか判断できない)
不正遷移防止の為にトークンのチェックは必要だけど
二度押し防止をする場合はjavascriptで行うのが正解かな。

トークンを二度押しに使用する場合は、
二度押しされた場合は仮に初回の処理が正常に終わっていても
エラー画面が表示されるんだろうな。一応不正遷移だから。
だけどその時は処理が完了している可能性もあるから、
処理は正常に終わっているけど、画面はエラー画面なんて、
たとえば完了画面に処理番号とか表示されるなんて画面だったら確認のしようがないな。その場合は二度押しする方が悪いってことなのか。
strutsが世にでてきてから永いからなんかいい解決方法があるんだろうか。

0 件のコメント:

コメントを投稿