PRGパターンを使うべきでない場面

開発中のWebアプリで、画面遷移を全部PRGパターンで統一しようとしていろいろ試した結果、今さらかもしれないけど気付いたこと。

自分の結論

PRG(POST-GET-REDIRECT)パターンは、Conversation境界で適用することに意味がある。Conversation途中の画面遷移では、PRGではなく普通にフォワードを使うべき。

理由

PRGパターンでは、前画面からの情報を引き継ぐ場合にセッションを使わなければいけない*1。セッションに保存した情報を破棄するタイミングについては、Flash Attributeのように即時破棄する考え方もあれば、LRU方式でいくつか溜め込む方法もあるだろう。ただ、いずれにしても近い将来に破棄されるので、「画面遷移後のリロード問題」に本質的に対処することができない。

「画面遷移後のリロード問題」というのは、遷移後の画面でユーザが再読み込みをすると、前画面からの引き継ぎ情報が消えてしまう問題。Flash Attribute式にセッション情報を即時破棄している場合は、画面遷移の直後からいつでも、F5を押した瞬間にアウト。LRU方式の場合でも、ユーザが複数ウィンドウを開いて操作していれば、情報消失の可能性は高まる。

素直にフォワードを使っていれば、こんな厄介なことにはならない。結局のところ、前画面から(リダイレクト時のURLパラメータに収まらないレベルの)情報を引き継ぐ必要のあるケース、つまりConversationの途中の画面遷移では、PRGパターンを使っても嬉しくない。

*1:セッションの代わりにDBを使う方法もある。この場合は、DBレコードの生存期間が長いので、本エントリで指摘している問題は起きない。