Struts を使用しての IE [戻る] ボタン制御 with PRGパターン

業務用 Web アプリを作る上で、ほぼ必ず出てくる問題としてブラウザの[戻る] ボタンの扱いがあります。業務アプリの場合、ブラウザの [戻る] ボタンを無効にして良い or 欲しいということがあるのですが、普通に実現するには JavaScript を多用したりと結構面倒なようです。

そこで、最近見かける(前からあったのかもしれませんが)方法として、同じ URL に遷移し続けるというのがあります。
いままで表示していた画面と同じ URL を遷移先として指定すると、IE の場合は画面が遷移していないと判断してくれます。これにより、IE に履歴が記録されないため、[戻る] ボタンを無効に出来ます。

ただ、遷移先の URL として常に同じ URL を指定する必要があるため、Web アプリを作る上ではちょっと小細工が必要になります。そこで、IE ではリダイレクトが行なわれた場合、リダイレクト先を遷移先として認識することを利用します。実装の形としては PRG パターンの GET 部分が常に同じ URL になるようにします。

具体的には、Struts を使用する場合は以下のようにします。

  1. RequestProcessor を継承し、doForward メソッドをオーバーライドする
  2. doForward メソッド内では JSP へのフォワードをフックし、JSP へはフォワードさせずにフォワード用サーブレットにリダイレクトする。
  3. 上記フック時に、セッションに JSPURI を記録しておく
  4. フォワード用サーブレットではセッションに記録されている JSPフォワードする

IE からは常に同じフォワード用サーブレットにリダイレクトしているため、URL が変化していないように見えます。こうして、[戻る] ボタンを無効化することが出来ます。