我正在編寫一個允許人們協作的Web應用程序。我希望將我的一些服務範圍擴展到協作(涉及少數人),而不是任何單個的http會話。我創建了一個存儲bean的自定義Scope
。爲了管理bean的生命週期,我把相關的會話ID的軌跡如下:將範圍連接到HttpSessionListener
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
實例訂閱其事件。但這似乎是多餘的,我不喜歡這種單身模式。如果我在
Scope
不得不進入HttpSession
,我可以在Scope
添加到存儲在會話列表,並有聽衆通知列表,該會議即將離開的成員。但我不明白如何在Scope
實例中使用會話對象(而不僅僅是它的id)。我可以讓我的
Scope
實現HttpSessionListener
接口,從而直接更新其狀態,但我不知道如何以編程方式註冊偵聽器。有沒有公開的方式來做到這一點?有沒有更好的方法?
感謝您的幫助,
基因
有一個[相關的問題](http://stackoverflow.com/questions/2433321/how-to-inject-dependencies-into-httpsessionlistener-using-spring)有一個更「春天」的解決方案。 – Eyal