jsf 2.0的“记住我”功能

| 我正在尝试实现“记住我” /“自动登录”功能。我已经在客户端存储了一个cookie,但是什么时候应该阅读它?例如,如果尝试在过滤器中执行此操作,则将无法访问用于访问数据库的应用程序范围的bean。 最佳做法是什么?     
已邀请:
        这在某种程度上取决于您当前的登录名是如何工作的。是容器登录后跟自定义内容(例如在会话中放入一些对象)还是仅自定义? 在第一种情况下,您无法完全在JSF中进行自动登录,因为只要用户尝试访问受保护的资源,容器就会启动。在这种情况下,您仍然需要在过滤器(
HttpServletRequest#login
)中进行容器登录。 对于第一种情况和第二种情况,JSF部分都可以通过全局“ 1”完成。在这种情况下,您可以收听非常早期的事件,例如
before RESTORE_VIEW
。在此事件处理程序中,您可以检查会话中是否放置了任何对象以标记您的登录,如果不存在,请使用
HttpServletRequest
检查是否有“记住我” cookie,然后继续如果需要,请登录。调用ѭ1时,JSF可以完全运行,并且可以访问应用程序范围的托管Bean。 如果您仅在会话中使用一个对象并且不打扰任何容器登录,则只需跳过第一部分。 ps。 另一个选择是不将任何数据库内容放入JSF托管Bean中,因此您不需要JSF操作即可访问数据库。在Java EE应用程序中,EJB bean是替代候选对象(实际上更适合此工作)。它们可以注入到您的过滤器中,并可以在JSF生命周期开始之前用于访问数据库。除了EJB bean,CDI bean也可以选择。在许多方面,无论如何,这些都是JSF托管bean的更好替代方案。     
        会话作用域将在会话处于活动状态时保留内容,并将其与状态持久性(无论是在DB中还是通过Cookie)结合在一起。 没有一个作用域会真正地“记住”您的状态,您可以做的最好的事情就是将状态持久保存到数据库中,并且当用户返回时,尽可能地将其还原并将数据推送到会话范围的bean中。 否则,通过cookie扩展sessionscope的会话
FacesContext.getCurrentInstance().getExternalContext.addResponseCookie(..)
    

要回复问题请先登录注册