Я пробую к тайм-ауту 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?
Теперь мне говорят, что это завершит сессию (или это все сессии?) на 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-запрос на сеанс, который завершился по таймеру, но еще не уничтожен, он будет уничтожен немедленно.
Теперь мне сказали, что это завершит сеанс (или все сеансы?) На 15-й минуте использования, независимо от их активности.
Нет, это неправда. Время ожидания сеанса
настраивает время ожидания сеанса в случае неактивности.
Эквивалентны ли эти методы? Стоит ли отдавать предпочтение конфигурации web.xml?
Параметр в файле web.xml является глобальным, он применяется ко всем сеансам данного контекста. Программно вы можете изменить это для конкретного сеанса.