我尝试在每个群集的hashmap中保存用户会话。当我需要使它无效时,我将采用指定的会话ID。并使用通常的方式使会话无效,使会话无效。
public class SessionListener implements HttpSessionListener {
public HashMap<String, HttpSession> sessionHolder = new HashMap<String, HttpSession>();
@Override
public void sessionCreated(HttpSessionEvent se) {
sessionHolder.put(se.getSession().getId(), se.getSession());
}
public void invalidate(String sessionId){
if(this.sessionHolder.get(sessionId)!= null){
System.out.println("Invalidate session ID : " + sessionId);
HttpSession session = sessionHolder.get(sessionId);
session.invalidate();
} else {
System.out.println("Session is not created in this cluster ID : " + sessionId);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session " + se.getSession().getId() + " has been destoryed");
sessionHolder.remove(se.getSession().getId());
}
}
会话将在无效发生的地方消亡。但是在其他群集会话上仍然是可用的。
为什么其他群集上的会话仍然存在。以及如何使其他集群上的会话无效。
感谢。
答案 0 :(得分:0)
(最好确认一下我们是在谈论服务器还是群集 - 你域名的config.xml会有所帮助)
会话对象仅由Web容器内的WebLogic Server管理 - 如果您在HashMap中手动创建会话对象的副本,无论是在另一个服务器还是另一个群集中,WebLogic Server都不会自动使该副本无效会话对象,因为它在Web容器之外。
WebLogic Server将自动且非常透明地创建HttpSession对象的复制副本,前提是您的&lt; session-descriptor&gt; weblogic.xml部署描述符中的元素具有正确的设置(建议使用replicated_if_clustered for persistent-store-type)
可在此处获取文档:http://download.oracle.com/docs/cd/E13222_01/wls/docs103/webapp/weblogic_xml.html#wp1071982
了解您在此处尝试实现的目标会很好 - 除非您正在讨论怪物应用程序或跨越广泛的网络段,否则不应该进行跨群集复制,尽管WebLogic Server支持它