Как мне получить список всех объектов HttpSession в веб-приложении?

Допустим, у меня есть работающее веб-приложение на основе Java с 0 или более действительными HttpSession объектами, связанными с ним. Мне нужен способ доступа к текущему списку допустимых объектов HttpSession . Я думал, что могу реализовать HttpSessionListener и использовать его для добавления к списку значений идентификатора сеанса, которые хранятся в атрибуте области приложения, но затем я нахожусь на крючке, чтобы обновить список как сеансы признаны недействительными и неизвестно что еще.

Прежде чем я начну готовить собственное решение, я подумал, что должен задать вопрос:
Предоставляет ли API сервлета какие-либо средства доступа к полному списку недействительных объектов сеанса?

Я использую Tomcat 6 .x в качестве контейнера моего веб-приложения и библиотеки MyFaces 1.2.x (JSF).

РЕШЕНИЕ
Я использовал подход, аналогичный тому, что BalusC обсуждал в этих существующих вопросах:

, которые я изменил классом SessionData для реализации HttpSessionBindingListener . Когда происходит событие привязки, объект либо добавляется, либо удаляется из набора всех объектов SessionData .

@Override
public void valueBound(HttpSessionBindingEvent event) { 
    // Get my custom application-scoped attribute
    ApplicationData applicationData = getApplicationData();
    // Get the set of all SessionData objects and add myself to it
    Set<SessionData> activeSessions = applicationData.getActiveSessions();
    if (!activeSessions.contains(this)) {
        activeSessions.add(this);
    }
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
    HttpSession session = event.getSession();
    ApplicationData applicationData = getApplicationData();
    Set<SessionData> activeSessions = applicationData.getActiveSessions();
    if (activeSessions.contains(this)) {
        activeSessions.remove(this);
    }
}

Единственное, что меня продолжает раздражать, - это то, что происходит при перезапуске Tomcat. Если Tomcat не настроен правильно, чтобы НЕ сериализовать сеансы на диск, он это сделает. Когда Tomcat снова запускается, объекты HttpSession (а также объекты SessionData вместе с ними) десериализуются, и сеансы снова становятся действительными. Однако сериализация / десериализация полностью обходит события слушателя HttpSession , поэтому у меня нет возможности аккуратно поместить десериализованную ссылку на SessionData обратно в мой управляемый набор объектов после рестарт.

У меня нет никакого контроля над производственной конфигурацией Tomcat в организации моего клиента, поэтому я не могу предположить, что это будет сделано так, как я ожидал.

Мое решение - сравнить время создания HttpSession со временем запуска приложения при получении запроса. Если сеанс был создан до времени запуска приложения, я вызываю invalidate () , и пользователь отправляется на страницу с ошибкой / предупреждением с объяснением того, что произошло.

Я получаю время запуска приложения, реализуя ServletContextListener и сохраняя текущее время внутри объекта в области приложения из метода contextInitialized () моего слушателя.

49
задан Community 23 May 2017 в 02:17
поделиться