Теперь мне говорят, что это прекратит сеанс (или это все сеансы?) На 15-й минуте использования, независимо от их активности .
Это неправильно . Он просто завершит сеанс, если связанный клиент (веб-браузер) не получит доступ к веб-сайту более 15 минут. Эта активность, безусловно, имеет значение, как вы и ожидали, если вы попытаетесь ее решить.
Кстати, HttpSession#setMaxInactiveInterval()
здесь мало что меняет. Он делает то же самое, что и <session-timeout>
в web.xml
, с той лишь разницей, что вы можете изменять / устанавливать его программно во время выполнения. Кстати, изменение влияет только на текущий экземпляр сеанса, а не глобально (иначе это был бы метод static
).
Чтобы поиграть и испытать это самостоятельно , попробуйте установить <session-timeout>
на 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-запрос в сеансе по тайм-ауту, но еще не уничтожен, он будет немедленно уничтожен.
Смотри также: