2010-12-18 10 views
22

セッションにデータを格納するJava Webアプリケーションがあります。セッション内のデータは、ユーザーがアプリケーションと対話するときに変更されます(たとえば、フローはコントローラによって管理され、各コントローラには複数のフォームページがあり、各フォームページにはデータがセッションで更新され、フローは次のフォームページに移動します)。複数のタブのWebアプリケーションセッションデータ/コントローラフローの管理

問題は、一部のユーザーがアプリケーションに複数のタブを開いていることです。各タブにはフローのステップが異なります。この時点で、セッション内のデータは、タブが同じセッションを共有しているため乱雑です(アプリはCookie管理セッションを使用します)。

別のブラウザを使用して同じセッションID(FirefoxのウィンドウとIEのウィンドウなど)を共有しないようにユーザーに指示することは、必ずしも誰かがこれを忘れてタブを使用することを忘れてしまい、彼らのデータをアップ。

別のフローが別のタブから要求されたことを検出し、これが許可されていないというメッセージをユーザに表示する検証を追加することは、ユーザの怒りとそれを望んでいないため選択できません。 :D

実際、別のタブを使用すると、アプリケーションを使用する上でより効率的であるため、このオプションを維持しているため、ユーザーにとっては便利です。しかし、今質問はの1つのセッションデータをより多くのタブで管理するにはどうすればいいですか?

私が考えたのは、コントローラがフローを開始し、このトークンを各フォームページに渡して、それを自分自身を識別するために戻すようにすることでした。進行中のフローがあるときに別のタブが同じコントローラアクションを要求した場合は、別のトークンを生成して渡します。

基本的には、各フローにトークンを持たせて、セッション内でデータセットを1つだけ保持するのではなく、トークンごとにデータセットを用意し、トークンに基づいてリクエストを一致させます。

このアプローチでは、アプリケーションに多くの書き換えが必要であり、このような状況を管理するためのベストプラクティスがあるのか​​、他のアプローチを提案できるのかどうか疑問に思っていました。私はアイデアを公開しています。

このような状況に遭遇しましたか?どのように扱ったのですか?

+0

別々のタブと別々のウィンドウの使用に違いはありません。セッションスコープは**ブラウザ全体で**、Cookieを使用して実装されているため(ほとんどの場合)**どのようなテクノロジースタックを使用していますか? JSP +サーブレット? JSF? –

+0

@Matt Ball:Servlets + JSPを使用しています。私は私の質問を更新しました。私はセッションがブラウザ全体に及んでいることを知っています。なぜなら、私は2つのウィンドウが1つのIEであると言いました。 – Gabriela

+0

「別のブラウザを使用する」という意味では、「同じセッションIDを共有しないように、タブの代わりに別のウィンドウを使用する」_という言い回しがありました。 –

答えて

14

これは通常、各タブ/ウィンドウにwindowIdを割り当て、各要求に渡すことによって行われます。 Jsfはorchestraでこれをサポートしています。 Spring mvcはそれを次のバージョンでサポートします。

私は最近これを単純なケースに必要としたので、私はそれを自分で実装しました。 30分かかりました。しかし、私の範囲は非常に限られていました:

  • は、各要求にwindowId渡し、次の要求のために戻ってそれを返します。初めて - それを生成します。任意のための
  • あなたがセッションに格納する属性、これはSeamを処理するために作成された正確に何であるキーがwindowId
+0

ありがとうございました。あなたはこれを参照していますか? http://myfaces.apache.org/orchestra/myfaces-orchestra-core/multiwindow.html – Gabriela

+0

はい。それでおしまい。私はそれを使用して、それはスムーズに動作します。しかし、それは春が必要です。 – Bozho

+0

@downvoter - 実行可能な2つのオプションを挙げると何が問題になりますか? – Bozho

0

あるMap<String, Object>を置きます。 SeamにはConversationというコンセプトがありますが、これは基本的にあなたが説明していることを正確に行います。会話は基本的に、セッションをいくつかのタイムアウトで期限切れになる多くの部分に分割する方法です。 org.jboss.seam.coreのソースコードを見ることができます。実際にどのようにインプリメントされインスピレーションを受けているか見るためのマネージャクラス)

0

アプリケーションの複雑さによっては、アプリケーション内のタブの実装を調べることができます。これにより、ユーザーに必要な機能を提供しながら、フロー全体を制御することができます。ブラウザがセッションを処理する方法に依存しないため、「既知の未知数」の数を最小限に抑えるので、最も頑強な解決策であると私は主張します。

もちろん、アプリケーションがどのように構造化されているかによって、これに先立って大きなコストがかかる可能性があります。あなたのアプリに関する詳細情報がなければ、あなたは決定するのに最適な人です。

+0

私は、そのバージョンをしようとする製品を使用する必要があります。それはしばしばうまく終わらない。ユーザーは引き続き標準のブラウザナビゲーションを使用したいと考えています。新しいタブを開いたり、ベストを期待したりすることはできません。私はこれまで経験したよりも良い仕事をすることが可能だと確信していますが、それは簡単ではないと思います。 –

0

あなたはまた、Adobe Air

内のアプリケーションをラップし、この空気からのみアクセス可能であるためにあなたのWebアプリケーションを制限しようとすることができます。これを行うことで、Webブラウザの断片化とその固有の動作を考慮する必要はありません。

関連する問題