2014-01-13 39 views
1

請考慮以下情形。Glassfish 3.X,以編程方式處理任意HTTPSession的終止

我已經在Glassfish 3.1.1上部署了一個Java EE Web應用程序(JSF 2.2,JPA,EJB 3.0,即使這裏的框架無關緊要),它具有一個登錄保護區,我通過該標準Glassfish安全機制。

我的商業模式基於將此Web應用程序作爲服務的訪問權限出售,禁止同時爲單個用戶名/密碼進行多次登錄。出於這個原因,我在我的數據庫中保留一列,以便在用戶登錄時遞增,並在用戶註銷時遞減。另外,我在用@PreDestroy註解的SessionScoped託管bean中有一個方法,負責在會話過期時(通過session-timeout屬性在web.xml中配置60分鐘)遞減計數器。

當用戶嘗試使用大於1的計數器登錄時,應用程序通知他有關該問題,請他先登錄以前的工作站。

這工作得很好,但我們有一個遞增量的用戶執行他們的操作,關閉瀏覽器(沒有登出),然後在會話超時限制內嘗試從不同的工作站進行身份驗證(其中,再次,我們已經設定爲60分鐘)。

在這種情況下,我們希望能夠報價關閉所有直接從新工作站(這樣的用戶X,登錄用自己的會話關聯到用戶登錄前幾屆會議的機會,應該可以要求終止與其賬戶邏輯鏈接的不同會話)。我知道,如果他/她只等了60分鐘,會議將最終由Glassfish終止,但我們希望避免來自這個「問題」的支持請求(您知道這很難解釋這種東西,技術用戶)。

我的第一個計劃是將用戶HTTPSession的jsession ID存儲在某處,通過存儲的jsession ID訪問舊會話(如果有的話),並根據需要關閉或使其失效。我已經閱讀了很多有關該主題的資料,並且我發現this SO question顯然是我正在尋找的答案(一種使用jsessionID作爲密鑰將HTTPSession存儲在地圖中以將其取回的方法)。這似乎很簡單,我可以在幾分鐘內實現這一點,但下面的評論,特別是來自@BalusC的答案的第二部分,促使我問我如何以安全的方式實現這一點。

這是一個最佳實踐的問題,你們如何實現這一點?

我不需要代碼,只需要您作爲Java EE架構師的意見或某個關於該主題的文檔的參考。

回答

0

跟蹤數據庫中的所有登錄(當會話被破壞時,您可以使用HttpSessionListener刪除條目)。確保你有一個布爾列「現在應該終止會話!」在DB中默認爲false。當現在執行該操作殺死所有其他會話時,爲這些會話設置布爾值爲true。在過濾器中,對每個請求,檢查數據庫中的布爾值並相應地進行處理。

這樣你就不需要處理所有物理實例。

+0

好吧,我明白你的觀點。不要摧毀所有舊的會話,而是建議從邏輯上使它們失效,以允許訪問新會話。即使我擔心過濾器引入的額外開銷會影響每個請求,這似乎也可以。我接受你的回答,如果它按預期工作,我會通知你。 – elbuild

相關問題