我想實現「記住我」/「自動登錄」功能。我在客戶端存儲了一個cookie,但我什麼時候應該閱讀它?例如,如果我嘗試在過濾器中這樣做,我將無法訪問用於訪問數據庫的應用程序範圍的bean。「記住我」功能與jsf 2.0
這樣做的最佳做法是什麼?
我想實現「記住我」/「自動登錄」功能。我在客戶端存儲了一個cookie,但我什麼時候應該閱讀它?例如,如果我嘗試在過濾器中這樣做,我將無法訪問用於訪問數據庫的應用程序範圍的bean。「記住我」功能與jsf 2.0
這樣做的最佳做法是什麼?
這要看當前的登錄完全相同的作用有點延長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更好的選擇。
只要會話處於活動狀態,會話範圍將保持內容,並將其與數據庫中的狀態持久性或通過Cookie結合使用。
非範圍將真正「記住」你自己的狀態,你可以做的最好的事情是堅持狀態到數據庫,當用戶返回時,儘可能最好地恢復它,並將數據推送到sessioncoped bean 。
否則通過cookie
FacesContext.getCurrentInstance().getExternalContext.addResponseCookie(..)
相關: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