#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 могут быть свои собственные слушатели. Вам пришлось бы поместить что-то в этот совершенно новый сеанс, чтобы заставить ваш запрос работать.