2011-06-12 68 views
1

我想實現「記住我」/「自動登錄」功能。我在客戶端存儲了一個cookie,但我什麼時候應該閱讀它?例如,如果我嘗試在過濾器中這樣做,我將無法訪問用於訪問數據庫的應用程序範圍的bean。「記住我」功能與jsf 2.0

這樣做的最佳做法是什麼?

+0

相關:http://stackoverflow.com/questions/5082846/java-ee-6-how-to-implement-stay-logged-in-when-user-login-in-to-the-web-applic – BalusC 2011-06-13 11:40:26

回答

3

這要看當前的登錄完全相同的作用有點延長sessionscope的會話。它是一個容器登錄,然後是自定義的東西(比如在會話中放置一些對象)或者只定制?

在第一種情況下,您無法在JSF中完全自動登錄,因爲只要用戶嘗試訪問受保護的資源,容器就會啓動。在這種情況下,您仍然需要在Filter中執行容器登錄部分(HttpServletRequest#login)。

對於第一種情況和第二種情況,JSF部分都可以通過全球PhaseListener完成。在這種情況下,你可以聽很早的事件,例如before RESTORE_VIEW。在這個事件處理程序中,您可以檢查會話中的任何對象,以標記您的登錄名,如果不存在,請使用HttpServletRequest檢查是否有「記住我」Cookie,並在需要時繼續登錄。當調用PhaseListener時,JSF完全可操作,您可以訪問應用程序範圍的託管bean。

如果你只在會話中使用一個對象,並且不打擾做任何容器登錄,那麼你可以簡單地跳過第一部分。

p.s.

另一種選擇是不把任何數據庫的東西放在JSF託管的bean中,所以你不需要JSF操作來訪問你的數據庫。在Java EE應用程序中,EJB bean是備選候選者(實際上更適合於此作業)。它們可以被注入你的過濾器,並在JSF生命週期開始之前用於訪問數據庫。在EJB bean旁邊,CDI bean也是一個選項。在很多方面,無論如何,這些都是JSF託管bean更好的選擇。

0

只要會話處於活動狀態,會話範圍將保持內容,並將其與數據庫中的狀態持久性或通過Cookie結合使用。

非範圍將真正「記住」你自己的狀態,你可以做的最好的事情是堅持狀態到數據庫,當用戶返回時,儘可能最好地恢復它,並將數據推送到sessioncoped bean 。

否則通過cookie

FacesContext.getCurrentInstance().getExternalContext.addResponseCookie(..) 
+1

我不相信你明白我的問題...... – bliof 2011-06-12 19:35:47

+0

顯然不是:-) 發佈一些過濾器代碼和管理你的登錄過程的代碼。 – 2011-06-12 19:41:20

+0

的想法是,當您在過濾器中編寫FacesContext.getCurrentInstance()時,它將返回null,並且我不知道在哪裏以及如何放置自動登錄,因爲我正在使用篩選器來限制用戶從某些頁面 – bliof 2011-06-12 19:49:43