2012-04-09 49 views
1

我正在爲我的web應用程序使用struts2。現在對於會話管理,我們實際上保留了會話中的用戶標識(即數據庫標識符),並在註銷時從會話對象中刪除此用戶標識。我們的會話對象(封裝用戶ID)正在實現sessionaware接口,因此我想我們會在會話映射中自動獲取所有與會話相關的信息。這是否適用於會話管理?

我的基本憎恨是註銷。我們只是從會話中刪除用戶標識,而不是真正「失效」會話,就像session.invalidate()一樣。

我是struts2的新手,甚至是我正在描述的這個產品原型。那麼是否有人可以告訴我,如果從會話中刪除用戶標識是足夠的,如果不是,那麼我可能具有哪種安全隱患?我是否也應該在註銷時做session.invalidate?

+0

去除會話ID之後訪問存儲在session範圍內(如果您有任何)變量得到一個錯誤是什麼綽綽有餘您。 – 2012-04-09 10:22:11

回答

0

在大多數情況下,從會話中刪除用戶標識應足以告訴您的應用程序用戶已註銷。如果可以,我還建議刪除所有其他會話變量並使會話cookie無效。這將防止任何意外的行爲,如果您的代碼使用其他會話變量,而無需首先檢查是否設置了用戶標識。

我通常在會話中存儲用戶標識以表明用戶已登錄並告訴我用戶是誰。如果這個值沒有設置,那麼我將用戶踢到登錄頁面。

0

絕不會做session.invalidate();只需在會話屬性中設置一個空值就足夠了(不需要刪除屬性!)。你的檢查應該是這樣的:

if(is the attribute present is session) 
    if(is the value of attribute null) { 
     go to login page; 
    } 
    else { 
     go to welcome page; 
    } 
} 
else { 
    go to login page; 
} 

使用session.invalidate()意味着你是在告訴looged出用戶已經沒有有效的會話,他是一個詛咒我們的網站:))

UPDATE: 從HTTPSession中docs

無效()

然後失效這屆解除綁定綁定到它的任何對象。

所以,你會試圖session.invalidate()

+0

wouldnt session.validate()清除出席會議的所有數據,從而幫助GC? – arya 2012-04-09 09:44:39

+0

我不明白'session.invalidate()'有什麼問題(因爲'session.invalidate()'沒有什麼問題,你需要備份你的聲明,它永遠不應該這樣做。 – 2012-04-10 09:47:21

+0

@arya刪除來自會話的對象(因此引用這些對象)做同樣的事情 - 沒有額外的*好處* GC明智的,除了調用invalidate刪除*所有*會話值,而不是依靠開發人員記住所有被放在會話 – 2012-04-10 09:48:33