0

我有一个使用表单身份验证的 JSF 登录页面。我通过调用 HttpServletRequest.login(username, password) 登录用户。注销是通过首先调用 ExternalContext.invalidateSession() 然后为当前用户调用 HttpServletRequest.logout() 来完成的。

我的计划是通过在用户登录时添加到列表中并在用户注销时从列表中删除来跟踪应用程序范围列表中的登录用户。

我对这种方法有两个担忧:

  1. 如果已经登录的用户在没有先注销的情况下尝试再次登录,我想使现有会话无效并进行一些清理。如何访问给定登录用户的会话?我还可以使用此功能强制注销某些用户。

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

4

1 回答 1

2
  1. 自己维护一个Map<User, HttpSession> logins应用范围。在登录过程中,检查是否logins.put(user, session)没有返回null,然后将其无效。

  2. User实施HttpSessionBindingListenervalueUnbound()相应地实施,以便它执行logins.remove(this). 或者,如果您无法控制User,则HttpSessionListener#sessionDestroyed()改为实施以执行删除。


与具体问题无关HttpServletRequest#logout(),如果您已经使会话无效,则无需调用。无论如何,用户都与会话相关联。

于 2012-10-22T02:26:31.727 回答