SessionTimeout: web.xml по сравнению с session.maxInactiveInterval ()

Я пробую к тайм-ауту HttpSession в Java. Моим контейнером является WebLogic.

В настоящее время нам установили наш тайм-аут сессии в файле web.xml, как это

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

Теперь, мне говорят, что это завершит сессию (или все это сессии?) на 15-й минуте использования, независимо их действия.

Я задаюсь вопросом, является ли этот подход корректным, или если я программно установил ограничение по времени неактивности

session.setMaxInactiveInterval(15 * 60); //15 minutes

Я не хочу отбрасывать все сессии в 15 минут, только те, которые были неактивны в течение 15 минут.

Действительно ли эти методы эквивалентны? Я должен одобрить конфигурацию web.xml?

58
задан informatik01 6 July 2013 в 19:18
поделиться

2 ответа

Теперь мне говорят, что это завершит сессию (или это все сессии?) на 15-й минуте использования, независимо от их активности.

Это неправильно. Он просто убьет сессию, если связанный с ней клиент (веб-браузер) не заходил на сайт более 15 минут. Активность, конечно, учитывается, именно так, как вы изначально ожидали, видя вашу попытку решить эту проблему.

Функция HttpSession#setMaxInactiveInterval() здесь, кстати, мало что меняет. Он делает то же самое, что и в web.xml, с той лишь разницей, что вы можете изменять/устанавливать его программно во время выполнения. Изменение, кстати, влияет только на текущий экземпляр сессии, а не глобально (иначе это был бы статический метод).


Чтобы поиграть и испытать это на себе, попробуйте установить на 1 минуту и создать HttpSessionListener следующим образом:

@WebListener
public class HttpSessionChecker implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent event) {
        System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
    }

}

(если вы еще не на Servlet 3. 0 и поэтому не можете использовать @WebListener, то зарегистрируйтесь в web.xml следующим образом):

<listener>
    <listener-class>com.example.HttpSessionChecker</listener-class>
</listener>

Обратите внимание, что сервлетконтейнер не будет немедленно уничтожать сессии после точного значения таймаута. Это фоновая работа, которая выполняется через определенные промежутки времени (например, 5~15 минут в зависимости от нагрузки и марки/типа сервлетконтейнера). Поэтому не удивляйтесь, если вы не увидите в консоли строку destroyed сразу после ровно одной минуты бездействия. Однако, когда вы отправляете HTTP-запрос на сеанс, который завершился по таймеру, но еще не уничтожен, он будет уничтожен немедленно.

См. также:

118
ответ дан 24 November 2019 в 18:49
поделиться

Теперь мне сказали, что это завершит сеанс (или все сеансы?) На 15-й минуте использования, независимо от их активности.

Нет, это неправда. Время ожидания сеанса настраивает время ожидания сеанса в случае неактивности.

Эквивалентны ли эти методы? Стоит ли отдавать предпочтение конфигурации web.xml?

Параметр в файле web.xml является глобальным, он применяется ко всем сеансам данного контекста. Программно вы можете изменить это для конкретного сеанса.

12
ответ дан 24 November 2019 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: