人々が共同作業できるようにする Web アプリケーションを作成しています。サービスの一部を、個々の http セッションではなく、コラボレーション (数人が関与する) に限定したいと考えています。Scope
豆を保存するカスタムを作成しました。Bean のライフサイクルを管理するために、次のように関連付けられたセッション ID を追跡します。
protected ConcurrentMap<String,Object> attributes =
new ConcurrentHashMap<String, Object>();
...
@Override
public Object get(String name, ObjectFactory<?> factory) {
synchronized(this.attributes) {
Object scopedObject = this.attributes.get(name);
if (scopedObject == null) {
scopedObject = factory.getObject();
this.attributes.put(name, scopedObject);
RequestAttributes reqAttrs = RequestContextHolder.currentRequestAttributes();
activeSession(name).add(reqAttrs.getSessionId());
}
return scopedObject;
}
}
セッションが終了したら、特定の Bean 名に関連付けられたアクティブなセッションのリストからセッション ID を削除したいと考えています。セットが空になったら片付けます。
管理セッションの終了を考える最も簡単な方法は を使用することですがHttpSessionListener
、私Scope
とリスナーの間に切断があります。次の可能性が見えます。
を静的に作成し
HttpSessionListener
、単一のインスタンスを想定して、サブスクリプション リストを管理し、Scope
インスタンスにそのイベントをサブスクライブさせることができます。しかし、それは冗長に思えます。私はこれに対するシングルトン パターンが好きではありません。HttpSession
のにアクセスできる場合は、セッションに保存されているリストScope
に を追加し、Scope
そのリストのメンバーにセッションが終了することをリスナーに通知させることができます。Scope
しかし、インスタンス内のセッション オブジェクト (ID だけでなく) を取得する方法がわかりません。Scope
インターフェイスを実装してその状態を直接更新することはできHttpSessionListener
ますが、リスナーをプログラムで登録する方法がわかりません。それを行う公的な方法はありますか?より良い方法はありますか?
ご協力いただきありがとうございます、
遺伝子