Conversation境界とポストバックと「戻る」ボタン

今業務で開発中のYmirアプリケーションはポストバック形式のつくりになっている。

上記アプリケーションの開発リーダの方が教えてくれるまでポストバックというものを知らなかったのだけど、なかなかすっきりしていて良い。

具体的には、フォームのボタンに紐づくアクションメソッドがフォーム画面に対応するPageクラスに配置されるので、とてもコードの見通しが良い。

ただ、その反面ブラウザの「戻る」ボタンとの相性はあまりよくないかもしれない。

例えばあるConversationの完了画面で「次へ」ボタンをポストバックとして実装していて、ボタンが押されたらConversationスコープに持たせておいた情報から動的にリダイレクト先を決定するようなつくりにしていた場合。

次の画面にリダイレクトした時点で前のConversationは終了しているため、次の画面でブラウザの「戻る」ボタンを押して表示された画面がブラウザによってキャッシュされている画面の場合、「次へ」ボタンを押しても以前のConversationが既に存在しないため、期待する動作をしないことになる。

一方で、元の画面をブラウザにキャッシュされないようなつくりにしている場合は、次の画面でブラウザの「戻る」ボタンを押した時点でリクエストがサーバに飛んでしまい、Conversationの途中に入り込む形になって「不正な遷移」エラーになってしまう。

結局今のアプリでは

  • 元画面はブラウザがキャッシュするようにする
  • 「次へ」ボタンはポストバックにせず、飛び先をHTMLに埋め込むようにする

という風にして上記問題を回避したが、なかなか悩ましい問題である。