2011-06-12 61 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