HttpSessionListenerを実装するSessionManagerがあります。SessionManagerには、アクティブなすべてのセッションの静的ハッシュテーブルがあります。セッションの無効化を強制する関数を作成しようとしています。次のようになります。
HttpSession session = sessionRegistry.get(key);
session.invalidate();
それは私がやりたいこと、つまり対象のセッションを破壊することです。ただし、@ConversationScopedマネージド Bean に副作用があるようです。
私のConversationBeanには、何らかの値を保持するプロパティがあります。sessionRegistryからセッションを無効にした後、 ConversationBean に保存されている値が破棄されることに気付きました。
- 別のセッションを無効にしていました (現在のセッションではなく、sessionRegistryからのもの)。
- セッションを無効にする前後にConversationBeanから値を出力しましたが、まだそこにあります。アクティブなセッションのリストを表示する@ViewScopedページを離れると、破棄されます。( @PreDestroyを使用してキャッチ)
- また、@ViewScoped Bean の@PreDestroyアノテーション付きメソッドで、会話 ID を出力しようとしましたが、既に無効化されています。はい、ConversationBeanのハッシュ コードも異なります。これは、 session.invalidateを呼び出す前に持っていたものとは異なるインスタンスであることを意味します。
- - 編集 - - -
この例は、私が達成しようとしていることを示しています:
次の値を持つアプリケーション スコープのハッシュテーブルsessionRegistryがあるとします。
Key | Value
---------------------
1 | HttpSession1
2 | HttpSession2
3 | HttpSession3
管理者としてログインします。今、私は別のセッションを持っていると信じています.HttpSession4としましょう。アプリケーションスコープのハッシュテーブルからいくつかのセッションを開始したいのですが、次のようにします:
HttpSession session = sessionRegistry.get(1);
session.invalidate();
HttpSession4にログインしているときにHttpSession1
を破棄しました。私の理解では、HttpSession1 の会話は、HttpSession4 に関連付ける必要がある現在の会話ではなく、破棄する必要があります。
私の質問は、これは本当に@ConversationScopedマネージド Bean の通常の動作ですか? 私が無効にしたセッションに関連付けられているようでした。