使特定用户的会话无效

Tha*_*ham 2 session jsf login invalidation

因此,对于我的webapp,如果我删除当前登录的用户,并且我想使他/她的会话无效.因此,只要他/她刷新页面或导航,他们就不再登录.我现在的方式是,如果用户成功登录,我将把用户对象存储在我的SessionScopedbean中,并将其存储HttpSessionApplication Map.以下是我的代码

这是我的SessionScoped豆子

@PostConstruct
public void init() {
    User user = UserDAO.findById(userId, password);
    Map<String, Object> appMap = FacesContext.getCurrentInstance().
             getExternalContext().getApplicationMap();
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().
             getExternalContext().getSession(false);
    appMap.put(userId, session);
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?如果是这样,我该如何清理我的应用程序图?

Bal*_*usC 5

这是正确的方法吗?

基本上有两种方式.

  1. HttpSession通过用户ID作为键将句柄存储在应用程序范围中,以便您可以获取它并使其无效.这可能适用于在单个服务器上运行的小型Web应用程序,但可能无法在服务器群集上运行的Web应用程序上运行,具体取决于其配置.

    我只会将它存储在应用程序范围中的另一个映射中,而不是像您一样直接存储在应用程序范围中,这样您就可以更轻松地获得所有用户的概述,并且可以保证任意用户ID不会与之冲突例如,现有的应用程序范围的托管bean名称.

  2. 将一个新的布尔/位列添加到与每个HTTP请求上检查的用户关联的某个DB表中.如果管理员将其设置为true,则与请求关联的会话将失效,并且DB中的值将被设置回false.


如何清理我的应用程序图?

你可以用HttpSessionListener#sessionDestroyed()它.例如

public void sessionDestroyed(HttpSessionEvent event) {
    User user = (User) event.getSession().getAttribute("user");
    if (user != null) {
        Map<User, HttpSession> logins = (Map<User, HttpSession>) event.getSession().getServletContext().getAttribute("logins");
        logins.remove(user);
    }
}
Run Code Online (Sandbox Code Playgroud)