質問: Java、SpringBoot、Thymeleafを使用して簡単な入力フォームのWebアプリを 制作しているのですが、入力フォームから次画面へ飛んだあと、ブラウザの戻るを押すと 「Webページの有効期限が切れています」 という警告が出てしまいます。 ブラウザバックで戻った際にこの警告を出さずに入力フォームへ戻り、かつ フォームに入力した内容が保持されているようにするにはどうすればよいでしょうか? 自分でやってみたこととしては、method="get"にしてみましたが、変化ありませんでした。
回答: あえてそういう挙動にしてあるのだと思います。 理由 === フォームの入力、送信が終わって次の画面に遷移し、特にエラーも表示されていないときを想像して下さい。これは「ユーザが入力したものをサーバが確かに受け取って、処理も成功した」というときです。ですから、ユーザが先ほどフォームに入力した情報を取っておいて再度送信できるようにする必要は、本来はないはずです。 ところが、[戻る] ボタンで戻ればブラウザキャッシュに残っている入力がフォームに表示されるのだとしてみます。すると、再度同じものを送れます。極端な場合には、[戻る] を押さなくても [リロード] ボタンを押すだけで、最初のユーザが入力した内容を何度でも送信できてしまいます。そもそもこれは、ユーザが入力したある情報が、その人が席を立った後でもブラウザに残っていて他人に閲覧できてしまう、ということです (たとえば、クレジットカード番号を入力していたら?)。 こういった挙動は、望ましいものではありません。 そういうわけで、フレームワークなどでは通常、フォーム入力をブラウザにキャッシュさせないよう対策しています (完璧ではありませんが)。ところが、昔のウェブアプリ等ではこのような対策がされないことが多かったので、[戻る] ボタンで戻れました。そのため、**「やり直したければ [戻る] ボタンで戻ればいい」というバッドノウハウ**が世の中に広まってしまいました。こういう事情があるため、「[戻る] を押したのに戻れない」というユーザからの苦情が、開発者に寄せられるのです。 対処 === ではどうすればいいかと言うと、アプリなどで**ユーザに [戻る] ボタンを使わせない**ような造りにすればいいです。 たとえば、フォーム画面を2ステップにしてつぎのようにします。 1. 最初の画面ではフォームに入力をさせ、「確認」のsubmitボタンで後の画面2.へ進みます。 2. 後の画面では入力内容を表示してユーザに確認させる (編集はできない) ようにします。「確定」と「修正」の2つのsubmitボタンを用意します。 ・「確定」が押されたら入力は確定です。 ・「修正」が押されたら最初の1.の画面に遷移して再びフォームを表示しますが、入力内容を入れた状態で表示します。 このようになっていれば、もはやブラウザの [戻る] ボタンを使う必要はありません。しかも、入力内容を確認する画面を設けることで、[戻る] ボタンを使うよりも使いやすくなります。 ちなみに、フレームワーク等の中には「パンくずリスト」の機能を提供するものがありますが、これも同様に、ユーザに [戻る] ボタンを使わせない対策の一環だと言えます。