Ответ 1
Я предполагаю, что ваши приложения действительно независимые контексты. Я сделал что-то похожее на то, что вы спрашиваете, используя HttpSessionListener
для каждого контекста. Трудная часть здесь заключается в том, что вам нужно иметь сборку сеансов, загружаемую загрузчиком корневого класса, в отличие от загрузчика класса контекста. Вот как я это помню:
Создайте класс, который содержит активные сеансы для каждого контекста. Этот класс должен находиться в каталоге tomcat/lib, чтобы он стал доступен для каждого контекста. Он не может быть частью какого-либо контекста.
public class SessionMap {
private static Map<ServletContext, Set<HttpSession>> map =
new HashMap<ServletContext, Set<HttpSession>>();
private SessionMap() {
}
public static Map<ServletContext, Set<HttpSession>> getInstance() {
return map;
}
public static void invalidate(String[] contexts) {
synchronized (map) {
List<String> l = Arrays.asList(contexts);
for (Map.Entry<ServletContext, Set<HttpSession>> e : map.entrySet()) {
// context name without the leading slash
String c = e.getKey().getContextPath().substring(1);
if (l.contains(c)) {
for (HttpSession s : e.getValue())
s.invalidate();
}
}
}
}
}
Создайте слушателя для каждого контекста.
public class ApplicationContextListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
ConcurrentMap<ServletContext, Set<HttpSession>> instance = SessionMap.getInstance();
synchronized (instance) {
ServletContext c = event.getSession().getServletContext();
Set<HttpSession> set = instance.get(c);
if (c == null) {
set = new HashSet<HttpSession>();
instance.put(c, set);
}
set.add(event.getSession());
}
}
public void sessionDestroyed(HttpSessionEvent event) {
ConcurrentMap<ServletContext, Set<HttpSession>> instance = SessionMap.getInstance();
synchronized (map) {
ServletContext c = event.getSession().getServletContext();
Set<HttpSession> set = instance.get(c);
if (c != null) {
set.remove(event.getSession());
}
}
}
}
Зарегистрировать каждого слушателя в соответствующем контексте web.xml
.
<listener>
<listener-class>ApplicationContextListener</listener-class>
</listener>
Затем вы можете вызвать следующую строку, чтобы аннулировать все из любого контекста.
SessionMap.invalidate();
Я синхронизируюсь на карте, чтобы быть в безопасности.