- - PR -
さんざん既出の「戻る」ボタンの制御について
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-12 11:36
なんてか・・・どうやったら「戻るボタンを押しただけで更新が走る」のか聞きたいくらいですが。 (うちでは当たり前のように「GETの場合には更新系の処理は行わない」設計になってるので、戻るボタンだけでは更新は(確か)されなかったよーな) (もちろんそれだけならキャッシュ切れの画面で更新ボタン押されたら更新されちゃいますが・・・)
1.フォームを発行する前に、Timestampとかハッシュを使ってフォームにIDを埋め込む。 2.1.で発行したIDをSessionで記憶しておき、POSTされた値のIDとSessionで記憶していた値が合っている場合のみ更新処理をする。 3.更新が走ったら、Sessionで記憶しているIDを削除する。 (正しい名前?は分かりませんが「チケットを発行して、チケットがある場合だけ更新」というイメージなのでチケット制とか呼んだりします。) ------------------------- 3が抜けてたので追加 [ メッセージ編集済み 編集者: 冬寂 編集日時 2005-07-12 11:58 ] | ||||||||
|
投稿日時: 2005-07-12 11:38
Sessionはサーバー上に値が保持されます。ViewStateはWEBブラウザ側で値が保持されます。もしWEBブラウザ上で戻るボタンなどにより別の画面に移動した場合には、ViewStateの値も元に戻ります。その後PostBackが発生した時点で、Sessionの値とViewStateの値を比較すれば、両者が一致しなくなっているはずです。これを利用して想定された画面遷移のシーケンスから外れたことを検出できます。
これはWEBアプリケーションを理解せずに作ったために作りこんだバグです。戻るにこだわっているけど、ブックマークやURLの直接入力で移動する事だってあるわけです。作り手の意図を無視して別のページに遷移することは防ぎようが無いので、楽観的ロック等で二重コミットなどに備えるのは常識ですよね。 | ||||||||
|
投稿日時: 2005-07-12 12:11
みなさま、色々ありがとうございます。
もちろん戻るボタンを押しただけでは更新処理は発生しませんが、 戻るボタンで表示されたページでの更新自体は、 このSessionとViewStateを使用したチェックにて制御できそうですね。 本当は、クライアントサイドで戻るボタンクリック時に ログイン画面に強制的に飛ばせたら言う事なしですが・・・。 その辺も皆さんのアドバイスをこれから色々試して見ます。 戻るボタンにこだわってるような書き方になってしまいましたが、 正規のメニューを通らないページ遷移といいましょうか。 キャッシュを利用したページ遷移ということです。 URLを直接打つ場合はまた違いますが・・・。うう、色々あるな。 現在のお客様では直接URLを打つ事はなさそうですが。 本当に修正すべきは、「戻るボタンクリック時でもおかしくならない」 というところなのでしょうが、今回はご勘弁ください・・・。 次への課題といたします。次は必ずや・・・! これから色々試して見ますので、 またアドバイス宜しくお願いいたします。 うまくいきましたらご報告いたします。 | ||||||||
|
投稿日時: 2005-07-12 12:59
わたしのところでは「システム開始」ボタンだけの画面を作成してボタンを押したら、メニューなしツールボタンなしのWindowsをJavaScriptで作成してそのWindowでシステムを開始しています。 もちろんこれだけではすべてのパターンを防ぎきれませんが・・・・ | ||||||||
|
投稿日時: 2005-07-12 13:17
ゆうじゅんさん、ありがとうございます。
確かにBSキークリック等、全ては防げませんが、 一つの防御策ですね。 やっておく価値はあるかも。 | ||||||||
|
投稿日時: 2005-07-12 13:37
設計レベルなので参考にはならないかと思いますが...
自分の場合、ユーザには極力「ページ」という概念を持たせないような画面設計にしています。 例えば画面構成をページ構成ではなくタブ構成にし、戻るという動作をする必要がないような画面にしたりとか。 # 開発者にとっては楽じゃないでしょうが... | ||||||||
|
投稿日時: 2005-07-12 13:59
ユーザーの変な操作を防ぐのではなくて、「ユーザーが操作に迷わないため」と考えてはいかがでしょうか。 戻るボタンの件も、画面上に「戻るボタンの使用は禁止」等のラベルを貼るのは「無粋」で、 ログイン画面に戻ったほうが「スマート」という考え方です。 このように考えると本当に重要な処理が何なのか見えてくると思います。 #とは言うものの社内向けのWEBアプリを作るときは「変な操作しないでね」とか言っちゃいますが… | ||||||||
|
投稿日時: 2005-07-12 17:25
皆さん、引き続きありがとうございます。
ちょっとよくわからない現象にはまっております。 現在、開発環境A(こちらは順次機能を追加していける環境)と、 客先と同じ環境B(リリースしているのと同じ環境)の二つがあるのですが、 基本的には同じソースです。 但し、Aは機能が追加されていますので微妙に違うところはあります。 Bの環境で ページ1表示→ページ2表示→戻るボタン とすると ページ1のASPX側のPage_Loadイベントに入ってくるのですが、 Aの環境で同じ事をしてもPage_Loadイベントにきません。 (ブレークポイントを張ってもこない) そもそも、どちらの動きが正しいのでしょうか? そして、何が違うためにこうなるのでしょうか? 戻るボタンクリックだとクライアントでの動きと思っていたので、 Page_Loadイベント(サーバーサイド)にはこないものと思っていました。 二つのソースを見比べてるのですが、どうにもわかりません。 何かヒントがありますでしょうか? | ||||||||
