2012-10-22 41 views
0

我有一个使用表单身份验证的JSF登录页面。我通过调用HttpServletRequest.login(用户名,密码)登录用户。首先调用ExternalContext.invalidateSession(),然后为当前用户调用HttpServletRequest.logout()来完成注销。如何跟踪使用JSF2和Servlet 3登录的用户

我的计划是通过在用户登录时随时添加到列表中,以便在用户登出时随时登录并从列表中删除,从而跟踪登录的用户在应用程序作用域列表中。

我有两个担心这种方法:

  1. 如果已经登录尝试,用户无需先退出再登录,我想无效现有会话,并做一些清理工作。如何访问给定登录用户的会话?我也可以使用此功能强制注销某些用户。

  2. 如果会话过期(例如超时)我想从登录用户列表中删除用户。我如何听会话到期?

回答

2
  1. 自己保持的应用范围Map<User, HttpSession> logins。在登录期间,检查logins.put(user, session)是否不返回null,然后使其无效。

  2. User执行HttpSessionBindingListener并相应地执行valueUnbound(),以便它执行logins.remove(this)。或者,如果您无法控制User,则执行HttpSessionListener#sessionDestroyed()而不是执行删除操作。


无关的具体问题,要求HttpServletRequest#logout()是不必要的,如果你已经失效了会议。无论如何,用户都会被绑定到会话中。

+0

您对问题1的回答是我正在考虑的问题,但希望得到不同的解决方案。对于第二个问题,我会尝试实现HttpSessionListener#sessionDestroyed()并查看它是如何发生的。谢谢。 – Zak

+0

不客气。 – BalusC

相关问题