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