Как сообщить пользователю, что срок его сеанса истек?
Вопрос
Я настроил Tomcat на удаление сеансов после 15 минут бездействия.Что-то вроде этого
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Всякий раз, когда пользователь обращается к странице с ограниченным доступом (требующей входа пользователя в систему), я проверяю сеанс, чтобы убедиться, что процесс входа в систему завершен.Если да, то доступ предоставляется, если нет, то пользователь перенаправляется на страницу входа, где ему/ей предлагается ввести действительный идентификатор и пароль.Если время сеанса истекло, пользователю необходимо снова войти в систему.И это нормально, но я хотел бы сообщить пользователю, что ему/ей необходимо снова войти в систему, поскольку время сеанса истекло.
Как мне это сделать?Я нашел интерфейс HttpSessionListener и подумал, что это может помочь, но метод sessionDestroyed вызывается прямо перед тем, как сеанс становится недействительным, поэтому установка параметра там бесполезна, как и ожидалось.
Решение
При входе в систему установите долгоживущий файл cookie (1 день?), который вы удалите (установите возраст равным 0) при обычном выходе из системы.Если вы снова попадете на страницу входа в систему, когда пользователь не вошел в систему и файл cookie все еще присутствует, это означает, что срок действия сеанса истек.
<c:if test="${empty user && not empty cookie.user}">
You were logged out because the session was expired.
</c:if>
Другие советы
Когда вы перенаправляете пользователя на форму входа в систему, установите параметр запроса, параметр URL-адреса или файл cookie, который указывает, что срок действия сеанса истек (удалите файл cookie после отображения формы входа, если вы используете файл cookie).Затем при отображении формы проверьте индикатор окончания сеанса и отобразите соответствующее сообщение.
Вы можете проверить, истек ли сеанс и/или истекло ли время ожидания, с помощью:
if (request.getRequestedSessionId() != null
&& !request.isRequestedSessionIdValid()) {
// Session is expired
}
Использовать getRequestedSessionId
различать новые и существующие (действительные/истекшие) сеансы и использовать isRequestedSessionIdValid
чтобы различать действительные и новые/истекшие сеансы.
Вы можете поместить этот код в Фильтр.