Как я могу удалить все мои сеансы в Tomcat?
Я хотел бы завершить все мои сеансы в Tomcat. Мы тестируем наш продукт под Fitnesse, и некоторые сеансы остаются, и конец сеанса вызывает зависимость между тестами. Я делаю это вручную со следующим кодом, но некоторые сеансы остаются (я могу проверить его с помощью http://localhost:8080/manager/html/list URL-адрес)
public static void expireAllSessions() {
String[] applications = { "a", "b", "c", "d", "e" };
for (String application : applications) {
try {
expireAllSessions(application);
} catch (Exception e) {
logger.error(e);
}
}
}
private static void expireAllSessions(final String application) throws Exception {
// cf doc http://hc.apache.org/httpclient-3.x/authentication.html
HttpClient client = new HttpClient();
client.getParams().setAuthenticationPreemptive(true);
Credentials userPassword = new UsernamePasswordCredentials("tomcat", "tomcat");
client.getState().setCredentials(AuthScope.ANY, userPassword);
String url = "http://localhost:8080/manager/html/expire";
NameValuePair[] parametres = new NameValuePair[] {
new NameValuePair("path", "/" + application),
new NameValuePair("idle", "0")
};
HttpMethod method = new GetMethod(url);
method.setQueryString(parametres);
client.executeMethod(method);
}
есть ли способ сделать это более эффективно и немедленно без остальные сессии ?
3 ответов
Я предполагаю, что ваши приложения действительно независимых контекстах. Я сделал что-то похожее на то, что вы просите, используя HttpSessionListener
для каждого контекста. Сложная часть здесь заключается в том, что вам нужно иметь коллекцию сеансов, загружаемую загрузчиком корневого класса, а не загрузчиком класса контекста. Вот как я это помню:--7-->
создать класс, который содержит Активные сеансы для каждого контекста. Этот класс должны находиться в каталоге 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();
Я синхронизируюсь на карте, чтобы быть в безопасности.
вы можете использовать HttpSessionListener для сохранения ссылок на сеансы в структуре данных, а затем использовать его на досуге
вы смотрели Лямбда-Зонд? Для каждого веб-приложения можно просмотреть содержимое сеанса и истечь срок его действия (все).
Если вы заинтересованы в написании собственного приложения, чтобы сделать это вместо этого; Lamda Probe является открытым исходным кодом, поэтому вы можете взять код от них, чтобы помочь достичь своей цели.