Java: атрибут Session только в следующей операции - PullRequest
0 голосов
/ 16 декабря 2010

Я публикую несколько строк в моей сессии с вызовом

request.getSession().setAttribute(key, value);

И сделать перенаправление с

response.sendRedirect(urlRedirect);

Почти во всех случаях значения находятся после перенаправления.

Но иногда я могу прочитать это значение только при просмотре следующей страницы, но не при перенаправлении. Там нет общего поведения.

Кто-то сталкивался с такой же проблемой?

Ответы [ 4 ]

3 голосов
/ 16 декабря 2010

Сеансы поддерживаются куки-файлом HTTP.При первом создании сеанса в заголовке ответа будет установлен файл cookie.По умолчанию файлы cookie привязаны только к определенному контексту.

Таким образом, если вы перенаправите файл, пока файл cookie еще не установлен, сеанс будет потерян.Чтобы обойти это, вам необходимо закодировать URL-адрес перенаправления.

response.sendRedirect(response.encodeRedirectURL(url));

Это добавляет к URL-адресу идентификатор jsessionid, который позволяет сервлет-контейнеру находить нужный сеанс без помощи файла cookie.

Если вам не нравится jsessionid, подумайте о реализации фильтра, подобного this , который гарантирует, что клиент узнает о куки-файле сессии до того, как запрос поступит в ваш контроллер, гдезапустить перенаправление.

Кроме того, если вы перенаправите в другой контекст, он не сможет получить доступ к тому же сеансу.Чтобы обойти это, вам нужно настроить контейнер сервлетов для совместного использования сеанса между контекстами.Например, в Tomcat проверьте атрибут emptySessionPath элемента <Connector> в /conf/server.xml.

1 голос
/ 16 декабря 2010

Такое поведение может быть вызвано кэшированием.

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

0 голосов
/ 16 декабря 2010

Проблема была решена путем изменения способа отправки.

Страница отправляла данные, только изменяя значение location.href на действие сервлета.

Мы вызываем функцию отправки только из формы страницы, и атрибуты сеанса работают нормально!

0 голосов
/ 16 декабря 2010

Вы уверены, что вам нужно выполнить перенаправление через браузер (response.sendRedirect ()), а не на стороне сервера (RequestDispatcher.forward ())? Последние быстрее, так как нет сети туда и обратно.

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