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,这可能会有所帮助。