Определение времени ожидания сеанса в Spring 3 / Spring Security 2.0.5 - PullRequest
3 голосов
/ 15 сентября 2010

У меня есть веб-приложение, работающее под Spring 3 с SpringSecurity 2.0.5. Чтобы представить пользователю изменения на сайте с момента его последнего посещения, я пытаюсь зарегистрировать время, когда его сеанс уничтожен. Поэтому я зарегистрировал org.springframework.context.ApplicationListener<HttpSessionDestroyedEvent>, а также javax.servlet.http.HttpSessionListener. Реализованные методы работают, когда пользователь использует ссылку выхода из системы. Но по истечении времени сеанса события как бы не генерируются.

Я забыл послушать правильные события? Или для тайм-аута сеанса ничего не происходит? Есть ли другой способ добиться этого? Зависит ли это от настроек сервера (например, tomcat 6.0.24)?

Ответы [ 2 ]

14 голосов
/ 15 сентября 2010

Я не делаю Spring, поэтому никаких формулировок по этому поводу, но javax.servlet.http.HttpSessionListener должно работать, если оно реализовано и зарегистрировано должным образом.Вам необходимо зарегистрировать его как <listener> в web.xml следующим образом:

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

Имейте в виду, что вы проверяете время ожидания сеанса в правильном направлении.Например, закрытие окна веб-браузера не приведет к немедленному уничтожению сеанса на стороне сервера.Сеанс будет действовать до тех пор, пока клиент не отправит HTTP-запрос в течение 30 минут.Эти 30 минут являются временем ожидания сеанса по умолчанию, которое настраивается с помощью записи <session-timeout> в web.xml.

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

См. Также:

2 голосов
/ 03 сентября 2013

Я думаю, что подход DelegatingSessionListener может быть полезен. Здесь уже упоминалось:

Как внедрить зависимости в HttpSessionListener, используя Spring?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...