Jsf 当同一用户从其他浏览器登录时,如何强制用户注销

Jsf 当同一用户从其他浏览器登录时,如何强制用户注销,jsf,session,logout,Jsf,Session,Logout,我的客户希望我实现一个功能,当同一用户从另一个浏览器登录时,强制用户自动注销。用户通过Firefox浏览器成功登录后,IE会话将中断。任何进一步的操作都将重定向到登录页面 有什么想法吗?您可以实现一个会话侦听器,它将用户名与jsessionId(会话对象)进行映射 然后,当用户登录时,您还应将其用户名映射到会话id,并检查他是否已经在映射上有会话,并且该会话无效: public String doLogin(){ String sessionId = userSessionMa

我的客户希望我实现一个功能,当同一用户从另一个浏览器登录时,强制用户自动注销。用户通过Firefox浏览器成功登录后,IE会话将中断。任何进一步的操作都将重定向到登录页面


有什么想法吗?

您可以实现一个会话侦听器,它将用户名与jsessionId(会话对象)进行映射

然后,当用户登录时,您还应将其用户名映射到会话id,并检查他是否已经在映射上有会话,并且该会话无效:

public String doLogin(){

        String sessionId = userSessionMap.get(username);
        if(sessionId != null){
            applicationScopeMap.get(sessionId).invalidate();
        }else{
            userSessionMap.put(username, FacesContext.getCurrentInstance().getExternalContext().getSessionId(true));
        }
        ...
    }

您可以实现一个请求筛选器,该筛选器访问单例/静态会话映射,用用户id键控并用会话id值。如果当前请求用户的会话id与存储的会话id不匹配,您将强制其注销。您能解释一下这一行吗?applicationScopeMap.put(se.getSession().getId(),se.getSession());applicationScopeMap是一个映射,您将使用它放置会话id作为密钥的会话。
public String doLogin(){

        String sessionId = userSessionMap.get(username);
        if(sessionId != null){
            applicationScopeMap.get(sessionId).invalidate();
        }else{
            userSessionMap.put(username, FacesContext.getCurrentInstance().getExternalContext().getSessionId(true));
        }
        ...
    }