2010-01-04 2 views
2

Я установил Tomcat, чтобы избавиться от сеансов после 15 минут бездействия. Что-то вроде этогоКак сообщить пользователю, что срок его сеанса истек?

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

Всякий раз, когда пользователь получает доступ к запретной страницы (тот, который требует, чтобы пользователь вошел в систему) проверить сессию, чтобы увидеть, если процесс Логин завершен. Если он имеет доступ, то доступ предоставляется, если он не был тогда, пользователь перенаправляется на страницу входа в систему, где ему/ей предлагается действительный идентификатор и пароль. Если сеанс истекает, пользователь должен снова войти в систему. И это прекрасно, но я хотел бы сообщить пользователю, что он/она должен войти в систему снова, потому что сессия закончилась.

Как мне это сделать? Я нашел интерфейс HttpSessionListener и подумал, что это может помочь, но метод sessionDestroyed вызывается непосредственно перед сеансом, который недействителен, поэтому установка параметра не является хорошей, как и ожидалось.

ответ

2

При входе в систему установите длинный живой файл cookie (1 день?), Который вы удаляете (установите возраст до 0) во время обычного выхода из системы. Если вы снова приземлитесь на странице входа в систему, когда пользователь не войдет в систему, а файл cookie все еще присутствует, значит, срок действия сеанса истек.

<c:if test="${empty user && not empty cookie.user}"> 
    You were logged out because the session was expired. 
</c:if> 
2

Когда вы перенаправляете пользователя в форму для входа, задайте параметр запроса, параметр url или файл cookie, который указывает, что срок действия сессии истек (удалите файл cookie после отображения формы входа в систему, если вы используете файл cookie). Затем, при отображении формы, проверьте индикатор срока действия сеанса и покажите соответствующее сообщение.

+0

Это действительно сложно ** установить ** этот параметр/cookie, когда сессия истекла. Как бы вы определили *, когда *, чтобы сделать это? В течение сеанса нет средств для «HttpServletRequest». Последующий новый запрос/сеанс не знает предыдущего. – BalusC

+0

Поместите файл cookie в браузер пользователя, когда пользователь входит в систему и токен в HttpSession. Если файл cookie существует, а сеанс или токен нет, то пользователь был зарегистрирован в последнее время, и их сеанс был отключен. –

+0

Да .. Именно так, как я ответил. Но вы сказали буквально * Когда вы перенаправляете пользователя в форму для входа *. Как бы Вы это сделали? – BalusC

2

Вы можете проверить, если сессия истекла и/или тайм-аут с:

if (request.getRequestedSessionId() != null 
     && !request.isRequestedSessionIdValid()) { 
    // Session is expired 
} 

Использование getRequestedSessionId различать новых и существующих (действующих/с истекшим сроком действия) сессий и использовать isRequestedSessionIdValid различать betwheen действительные и новые/истекшие сеансы.

Вы можете положить этот код в Filter.

+1

Это хорошая находка. Вы можете, кстати, просто сделать это в EL. Запрос доступен через '$ {pageContext.request}'. – BalusC

+0

Спасибо, это очень хороший подход – pgmura