Java 当用户再次登录时使会话无效

Java 当用户再次登录时使会话无效,java,authentication,session,httpsession,Java,Authentication,Session,Httpsession,如果用户再次登录到我的应用程序(例如从其他浏览器),我需要删除现有会话 我正在使用这种方法: public class LoginUserDetails implements HttpSessionBindingListener { private static final long serialVersionUID = 1L; // All logins. private static Map<LoginUserDetails, HttpSession>

如果用户再次登录到我的应用程序(例如从其他浏览器),我需要删除现有会话

我正在使用这种方法:

public class LoginUserDetails implements HttpSessionBindingListener {
   private static final long serialVersionUID = 1L;    
   // All logins.
   private static Map<LoginUserDetails, HttpSession> logins = new  ConcurrentHashMap<LoginUserDetails, HttpSession>();

   private UserInfo userInfo = new UserInfo();
   @Override
   public void valueBound(HttpSessionBindingEvent event) { 
   HttpSession session = logins.remove(this);
     if (session != null) {
      log.info("LoginUserDetails - Killing session {} ", session.getId());
      session.invalidate();
     }
    logins.put(this, event.getSession());      

    }
   @Override
   public void valueUnbound(HttpSessionBindingEvent arg0) {
     logins.remove(this);  
   }

  @Override
  public boolean equals(Object other) {
    return true; // fake
   }
 @Override
 public int hashCode() {
   return -1; //fake
 }

}
公共类LoginUserDetails实现HttpSessionBindingListener{
私有静态最终长serialVersionUID=1L;
//所有登录。
私有静态映射登录=新ConcurrentHashMap();
private UserInfo UserInfo=new UserInfo();
@凌驾
public void valueBound(HttpSessionBindingEvent事件){
HttpSession=logins.remove(此);
if(会话!=null){
log.info(“LoginUserDetails-Killing session{}”,session.getId());
session.invalidate();
}
logins.put(这个,event.getSession());
}
@凌驾
public void valueUnbound(HttpSessionBindingEvent arg0){
删除(这个);
}
@凌驾
公共布尔等于(对象其他){
返回true;//假
}
@凌驾
公共int hashCode(){
return-1;//false
}
}
它在我的开发机器上工作,但在我们有集群的真实环境中不起作用。原因很简单:当第二次尝试登录指向集群的另一个节点时,我在map中没有以前的会话

一个解决方案可能是最终在db上保存我的sessionId,并在登录时检索会话ID。。。但是如何使sessionId中的会话无效


那么,在任何情况下,正确地使会话无效的方法是什么?

除非使用粘性会话(不推荐),否则集群之间需要共享资源,例如您提到的数据库或缓存。假设我决定使用数据库,该方法是什么?我是说,我应该保存sessionId吗?然后,如何使从sessionId开始的会话无效?数据与任何其他数据一样,只需设计表,并使用代码访问表。无论使用哪个web容器,都应该有钩子来插入您的实现。可能有一些现成的实现可以处理它。我正在寻找一种方法,通过ID使会话无效,在代码中替换session.invalidate()。rest(表结构或如何存储和检索数据)不是问题。请你提出一个解决方案好吗?我正在使用WebSphere7,这可能会有所帮助。