4

私は単一ページのjQuery&Backbone.jsWebアプリを開発しています。バックエンドはJBoss6アプリケーションサーバーです。

これまで、次の構造がありました。

  • サーブレット(フロントコントローラー)は1つだけです。JavaScriptクライアントからのすべてのリクエストはここを通過します。
  • サーブレットでは、特定のJSクライアントの最初の要求で、ステートフルセッションBeanを調べます。このクライアントの次のリクエストのために、ルックアップの結果をHTTPセッションコンテナに保存します。したがって、すべてのJSクライアントにはステートフルセッションBeanが1つだけあります。この接続は、セッションCookieによって保持されます。

今、私は追加の要件があります:

ユーザーが(1つのブラウザーに)2つのブラウザータブを持っている場合、すべてのブラウザータブにWebアプリの2つの分離されたインスタンスが必要です。このセッションCookieはすべてのブラウザタブ用であるため、セッションCookieに問題があります。

次のように構造を変更する必要があります。

  • サーブレットは、特定のJSクライアントの最初のリクエストに対して新しいセッションIDを生成する必要があります。このセッションIDはクライアントに伝達されます。
  • バックエンドへのPOSTごとに、JSクライアントはこのセッションIDを送信する必要があります。

私の質問は:

これまで、ルックアップの結果をHTTPセッションオブジェクトに保存し、セッションIDの生成について考える必要はありませんでした。しかし今、私はこれをどこかに保管しなければなりません、どこに?

誰かがこの種の設定を経験し、私を助けることができますか?

更新:
この非常に興味深いアプローチをありがとうBalusC。
私があなたをよく理解したとき、これは次のことを意味します:

1つのブラウザのタブのすべての個々のJSクライアントは、1つのHTTPセッションオブジェクトを共有します。また、このHTTPセッションオブジェクトでは、すべてのタブに独自のエントリポイントがあります。それは本当にいいですね。したがって、HTTPセッションインフラストラクチャ全体を引き続き使用でき、車輪の再発明を行う必要はありません。

4

2 に答える 2

4

最初の GET リクエストで一意の値を自動生成し、それを保存して、その後のすべてのポストバックで非表示の入力値として渡します。ビュー スコープのデータを表すセッション属性の識別子として、この一意の値を使用します。

真新しいセッションでの最初のリクエスト中に、次のことを行います。

Map<String, ViewData> viewScope = new HashMap<String, ViewData>();
session.setAttribute("viewScope", viewScope);

( はViewData、同じビューのポストバック全体で追跡するビュー固有のデータを表します)

すべての GET リクエスト中に、次のことを行います。

String viewDataId = UUID.randomUUID().toString();
viewScope.put(viewDataId, new ViewData());
request.setAttribute("viewDataId", viewDataId);

HTML の生成中に、次の操作を行います。

<input type="hidden" name="viewDataId" value="${viewDataId}" />

すべての POST リクエスト中に、次のことを行います。

ViewData viewData = viewScope.get(request.getParameter("viewDataId"));
// Get/set view-specific data in there.

$(form).serialize()jQuery もこの非表示の入力を渡していることを確認してください (フォームを ajax 化するために AjaxForm プラグインなどを既に適切に使用している場合、これは大きな問題にはなりません)。

Java EE の MVC フレームワークJSFに精通している場合は、その@ViewScopedアノテーションが上記とほぼ同じように機能することを知っておくと役立ちます。ao も参照してください。適切な Bean スコープを選択するには?

于 2012-11-08T15:52:45.917 に答える
0

URL 書き換えでセッション トラッキングを使用できます。ここを参照してください:

タブ間で共有されるセッション

于 2012-11-08T15:58:18.607 に答える