JSF 2.0 的"remember me"功能



我正在尝试实现"记住我"/"自动登录"功能。我在客户端存储了一个cookie,但我什么时候应该读取它?例如,如果我尝试在过滤器中这样做,我将无法访问用于访问数据库的应用程序范围的bean。

做到这一点的最佳做法是什么?

这在一定程度上取决于您当前登录的具体工作方式。它是一个容器登录,然后是自定义的东西(比如在会话中放置一些对象)还是只自定义?

在第一种情况下,您不能在JSF中完全进行自动登录,因为每当用户试图访问受保护的资源时,容器就会启动。在这种情况下,您仍然需要在Filter(HttpServletRequest#login)中执行容器登录部分。

对于第一种和第二种情况,JSF部分都可以通过全局PhaseListener来完成。在这种情况下,您可以收听非常早期的事件,例如before RESTORE_VIEW。在这个事件处理程序中,您可以检查会话中放入的任何对象,以标记您的登录,如果不存在,请使用HttpServletRequest检查是否有"记住我"cookie,并在需要时继续登录。当调用PhaseListener时,JSF是完全可操作的,您可以访问应用程序范围内的托管bean。

如果您只在会话中使用一个对象,而不需要进行任何容器登录,那么您可以简单地跳过第一部分。

p.s.

另一种选择是不将任何DB内容放在JSF管理的bean中,因此您不需要JSF操作来访问您的DB。在JavaEE应用程序中,EJB bean是备选方案(实际上更适合此工作)。它们可以被注入到过滤器中,并用于在JSF生命周期开始之前访问DB。除了EJB bean之外,CDI bean也是一个选项。无论如何,在许多方面,这些都是JSF托管bean的更好的替代方案。

只要会话处于活动状态,会话作用域就会保留内容,将其与DB中或通过cookie的状态持久性相结合。

没有一个作用域会自己真正"记住"你的状态,你能做的最好的事情就是将状态持久化到DB中,当用户返回时,尽可能地恢复它,并将数据推送到会话作用域bean中。

否则,通过cookie 扩展会话范围的会话

FacesContext.getCurrentInstance().getExternalContext.addResponseCookie(..)

相关内容

  • 没有找到相关文章

最新更新