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