Visual Forceでのブラウザバック対策

salseforceでフォームを作成している際、
完了画面を表示させた後にブラウザで戻るボタンを押すと、
フォームや確認画面に戻ってしまい、更に入力した内容が表示されてしまう。

このまま何も対策を取っていないと、二重送信されてしまうおそれがあるので、
対策を考えてみた。

基本的な考え方は以下の通り。

セッションとhistory.back()とブラウザの戻るボタン。

まずは、上記と同じように、一度送信が完了した段階で、
それとわかるフラグを立てておきます。
再度入力画面を表示させようとすると、このフラグが立った状態だとエラー画面へ遷移するように設定しておきます。

しかし、salseforceでデフォルトの設定のまま(?)作業すると、
戻るボタンを押した際には、キャッシュされたページが表示されます。
(入力された値も含めて)

なので、キャッシュを無効にして、ページが無条件で表示されないようにします。
入力ページの冒頭に以下の設定を入れます。

<apex:page . . .  cache="false" >

こうすると、完了画面に遷移後、この入力ページへ戻ってくると、
「フォーム内容を再送信して下さい。」のような画面が表示され、リロードせざる得なくなります。
そうすることで、フラグを判定してエラーページへ遷移させることが出来ました。


この事を調査している時に知ったのですが、
(基本的な事のようですが、)
setRedirectを利用すると、値を引き継ぐか、URLを変更するか、が選べるようです。

画面遷移する際にPageReferenceのsetRedirect(false)を使用することで変数の値を引き継ぐことができます。
SFDC:2つのVFページと同一コントローラ

デフォルトではfalseに設定されているようです。
なので、確認画面への遷移などでは、URLは変わらず、同一コントローラー内の値も引き継がれます。
しかし、完了画面への遷移の際は値は必要なく、URLも変わって欲しいので、上記をtrueで遷移させた方が良さそうです。

//apexクラスの関数内で
return Page.FormComplete.setRedirect(true);

しかしこれをしてしまうと、最初に書いた判定用のフラグの値も引き継がれないので、
逆に値がなければエラー、という流れで作ったほうがいいかもしれません。

   このエントリーをはてなブックマークに追加