セッションにデータを格納するJava Webアプリケーションがあります。セッション内のデータは、ユーザーがアプリケーションと対話するときに変更されます(たとえば、フローはコントローラによって管理され、各コントローラには複数のフォームページがあり、各フォームページにはデータがセッションで更新され、フローは次のフォームページに移動します)。複数のタブのWebアプリケーションセッションデータ/コントローラフローの管理
問題は、一部のユーザーがアプリケーションに複数のタブを開いていることです。各タブにはフローのステップが異なります。この時点で、セッション内のデータは、タブが同じセッションを共有しているため乱雑です(アプリはCookie管理セッションを使用します)。
別のブラウザを使用して同じセッションID(FirefoxのウィンドウとIEのウィンドウなど)を共有しないようにユーザーに指示することは、必ずしも誰かがこれを忘れてタブを使用することを忘れてしまい、彼らのデータをアップ。
別のフローが別のタブから要求されたことを検出し、これが許可されていないというメッセージをユーザに表示する検証を追加することは、ユーザの怒りとそれを望んでいないため選択できません。 :D
実際、別のタブを使用すると、アプリケーションを使用する上でより効率的であるため、このオプションを維持しているため、ユーザーにとっては便利です。しかし、今質問はの1つのセッションデータをより多くのタブで管理するにはどうすればいいですか?
私が考えたのは、コントローラがフローを開始し、このトークンを各フォームページに渡して、それを自分自身を識別するために戻すようにすることでした。進行中のフローがあるときに別のタブが同じコントローラアクションを要求した場合は、別のトークンを生成して渡します。
基本的には、各フローにトークンを持たせて、セッション内でデータセットを1つだけ保持するのではなく、トークンごとにデータセットを用意し、トークンに基づいてリクエストを一致させます。
このアプローチでは、アプリケーションに多くの書き換えが必要であり、このような状況を管理するためのベストプラクティスがあるのか、他のアプローチを提案できるのかどうか疑問に思っていました。私はアイデアを公開しています。
このような状況に遭遇しましたか?どのように扱ったのですか?
別々のタブと別々のウィンドウの使用に違いはありません。セッションスコープは**ブラウザ全体で**、Cookieを使用して実装されているため(ほとんどの場合)**どのようなテクノロジースタックを使用していますか? JSP +サーブレット? JSF? –
@Matt Ball:Servlets + JSPを使用しています。私は私の質問を更新しました。私はセッションがブラウザ全体に及んでいることを知っています。なぜなら、私は2つのウィンドウが1つのIEであると言いました。 – Gabriela
「別のブラウザを使用する」という意味では、「同じセッションIDを共有しないように、タブの代わりに別のウィンドウを使用する」_という言い回しがありました。 –