Помогает уловить тайм-аут сеанса весной

#java #spring #session #timeout

#java #весна #сессия #тайм-аут

Вопрос:

У меня есть простое приложение Spring 3 MVC. Я использую атрибут SessionAttribute, и все работает нормально, за исключением случаев, когда я оставляю страницу на 30 минут или дольше. Затем я получаю

org.springframework.web.HttpSessionRequiredException

сообщающий мне, что мой объект не найден в сеансе.

Я думаю, мне нужно каким-то образом перенаправить обратно на ту же страницу, когда происходит тайм-аут сеанса. Я не уверен, как правильно это сделать с spring.

Вход в систему не требуется, и я уже проверяю, равен ли объект null.

Любые предложения будут оценены.

Спасибо

Ответ №1:

Вы можете добавить привязку страницы ошибки к HttpSessionRequiredException, которая перенаправит на первую страницу вашего приложения

пример:

web.xml

 <web-app>
    <error-page>
        <exception-type>org.springframework.web.HttpSessionRequiredException</exception-type>
        <location>/index.jsp</location>
    </error-page>
</web-app>
  

Комментарии:

1. Не могли бы вы привести пример этого, пожалуйста?

2. Спасибо, похоже, это сработает. Я просто пытаюсь правильно отобразить мою страницу с ошибкой. Из того, что я заметил, похоже, что он будет отображен обратно через сервлет spring dispatcher, поэтому мне нужно добавить отображение в один из моих контроллеров, чтобы перейти на эту страницу?

3. @blong824, я не очень разбираюсь в spring mvc, но мое решение типично для веб-приложений, поэтому я думаю, вам следует выполнить только приведенное выше сопоставление страниц с ошибками и оно должно работать.

Ответ №2:

Вы не можете просто перенаправить «обратно на ту же страницу». Ваш сеанс завершен, то есть файл cookie, который у вас есть на клиенте, больше не соответствует ни одному сеансу в контейнере сервлета, потому что объект сеанса был удален из памяти. Полностью, необратимо.

Вы можете увеличить время ожидания сеанса. Это конфигурация приложения, а не Spring:

web.xml:

    <session-config>
     <session-timeout>120</session-timeout>
   </session-config>
  

это даст вам два часа простоя сеанса.

Обратите внимание, что сеансы не являются бесплатными. Они потребляют ресурсы (память и диск при сериализации). Если один и тот же пользователь может повторно входить в систему несколько раз, у них будет несколько сеансов ожидания, что потенциально может привести к сбою.

P.S. Если вы согласны с завершением сеанса и просто хотите сразу установить другой, вы всегда можете сделать это в фильтре, Spring или нет. У Spring могут быть свои собственные слушатели. Вам пришлось бы поместить что-то в этот совершенно новый сеанс, чтобы заставить ваш запрос работать.