「戻る」の制御

Webアプリ全般に言える事だと思うのですが、「戻る」の制御のベストプラクティスは無いのでしょうか?
ここで言う「戻る」はブラウザのボタンによる「戻る」ではなくフロー制御の「戻る」です。
単純にJavascriptでhistory.back();と書いてしまうと場合によっては無限ループになってしまいます。
遷移が単純な1ルートしかないのであれば直接指定して前の画面に戻ることは可能です。しかし、戻る画面が変化する場合は簡単にはいきません。
例えばAという画面があるとします。この画面はBからも来れるしCからも来れる。こういった場合にBからきた場合はBに戻り、Cから来た場合はCに戻るという制御が考えられます。
どこから来たのか?という情報をパラメータで渡すのはダサいので、何かいい方法はないでしょうか?
ぱっと思いつくのが直前のURL等をセッション等に保存しておいてそこに戻す。という方法です。これだとどこから来たのか分かるので戻れそうな気がします。
でも、さらにBがDとEから遷移できるとすると D -> B -> A と遷移すると直前の情報しか保存していないので A -> B -> Dと戻ることができません。これに対応するためには直前のURL等をスタックに入れることで解決しそうです。


これでうまくいきそうなのですが、このスタックをいつまで保存しておくか?ということが問題になりそうです。ログアウトするまで全て保存するわけにもいかないので、どこかでリセットする必要があると思います。
例えばメニューから各機能にアクセスした場合や、一連のフローが完結した場合などが考えられると思います。


あとはこれを実装してみるだけですね。
これだとダメだよ。他にもいい方法があるよ。っていうツッコミがあればお願いします。


こう考えると、画面フローの設計の段階で矛盾のないようにしておかないと後で痛い目を見ることが良く分かります。


追記
Actionにフロー制御の情報を入れるのは良くないと思うので、Webwork的にはInterceptorで実装するのがいいのかな。Interceptorで履歴を保存しておいて、戻るActionを叩くと履歴を見て適切なところに遷移する。っていう感じかなぁ。