Сеанс теряется и создается как новый в каждом запросе сервлета - PullRequest
33 голосов
/ 26 января 2010

У меня есть большая проблема. Мой текущий сеанс пропадает каждый раз, когда я отправляю новый запрос на сервер.

Я проверил во многих местах. Я не могу найти в чем проблема. Я также включил session-config в web.xml как в tomcat, так и в приложении. Я также позволил принимать куки в моих браузерах. Проверено в каждом браузере. Это не работает.

Я просто разрабатываю простое приложение на Java с использованием JSP / Servlet. Я столкнулся с проблемой только после того, как развернул на tomcat на сервере.

Ответы [ 9 ]

37 голосов
/ 26 января 2010

Одной из возможных причин этого является наличие «голого» имени хоста (т.е. без доменной части). Это довольно часто, если вы работаете в Интранете.

Проблема в том, что почти все файлы cookie браузера не принимают файлы cookie для имен хостов без имени домена. Это сделано для того, чтобы evilsite.com не мог установить Cookie для com (что было бы плохо, поскольку это был бы конечный файл cookie для отслеживания).

Таким образом, если вы получите доступ к своему приложению через http://examplehost/, он не примет cookie-файл, а для http://examplehost.localdomain/ он примет (и вернет) cookie-файл просто отлично.

Самое неприятное в этом то, что сервер не может различить «браузер получил cookie и проигнорировал его» и «браузер так и не получил cookie». Таким образом, каждый отдельный доступ будет выглядеть как совершенно новый урок для сервера.

19 голосов
/ 28 января 2016

Спустя годы я так и не разместил ответ здесь. В то время я был занят и забыл об этом вопросе. Но сегодня я, как обычно, ищу решение в Stackoverflow и вижу это уведомление, в котором говорится, что я получаю очки за этот вопрос. Похоже, что другие разработчики сталкиваются с той же проблемой. Итак, я попытался вспомнить, как я решил проблему. И да, я решил вручную вернуть идентификатор сессии, чтобы отслеживать / поддерживать идентификатор сессии.

Пожалуйста, посмотрите код, который я вручную положил обратно в jsessionid внутри сервлета.

HttpSession session = request.getSession();
if (request.getParameter("JSESSIONID") != null) {
    Cookie userCookie = new Cookie("JSESSIONID", request.getParameter("JSESSIONID"));
    response.addCookie(userCookie);
} else {
    String sessionId = session.getId();
    Cookie userCookie = new Cookie("JSESSIONID", sessionId);
    response.addCookie(userCookie);
}
4 голосов
/ 26 января 2010

Сначала проверьте, если context.xml веб-приложения не настроено cookies="false".

Кроме того, полезно знать, что файлы cookie зависят от домена, порта и контекста. Если ссылки на странице указывают на другой домен, порт и / или контекстный путь в отличие от текущего URL-адреса запроса (который вы видите в адресной строке браузера), то cookie не будет передан в результате чего сеанс больше не будет идентифицирован, и, таким образом, вы получите новый от контейнера сервлетов.

Если это не причина, то проверьте, не выполняете ли вы перенаправление на каждый запрос, используя HttpServletResponse.sendRedirect() по какой-то причине. Если вы сделаете это уже по самому первому запросу, то куки будут потеряны. Вам нужно будет заменить

response.sendRedirect(url);

по

response.sendRedirect(response.encodeRedirectURL(url));
3 голосов
/ 26 января 2010

Пожалуйста, проверьте, не является ли сеанс недействительным в вашем коде. Ищите код, похожий на request.getSession().invalidate();

3 голосов
/ 26 января 2010

Попробуйте добавить в Firefox плагин Live Http Headers , убедитесь, что cookie-файл сеанса действительно передается в браузер с сервера, и убедитесь, что браузер отправляет его снова при следующем запросе. .

2 голосов
/ 24 сентября 2017

Я столкнулся с проблемой устаревшего файла cookie сеанса https (мой специальный термин) из-за флага secure .

У меня была эта проблема при переключении между http и https. Файл cookie, сохраняемый сеансом https, никогда не перезаписывался сеансом http. Это осталось в памяти FireFox на вечность. Это было видно в FireFox Инструменты / Параметры / Конфиденциальность / Удалить отдельные куки , где в поле Отправить для это было Только для безопасных соединений . Очистка этого файла cookie или всех файлов cookie - это обходной путь.

Я отлаживал проблему с помощью wget и заметил такой заголовок:

Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly

Слово безопасный появляется только в соединениях https и создает этот устаревший файл cookie. Это SecureFlag (см. OWASP ). Есть способы отключить этот флаг на стороне сервера, который кажется постоянным решением, но, возможно, небезопасным.

Или это ошибка браузера, что куки не перезаписываются?

1 голос
/ 11 января 2018

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

1 голос
/ 28 апреля 2017

Отредактируйте свой файл tomcat context.xml и замените тег <Context> на <Context useHttpOnly="false">, это помогло мне.

0 голосов
/ 05 февраля 2018

В Вашей собственности

  server.session.cookie.http-only=true
  server.session.cookie.secure=true

Удалите эти настройки, он сохранит ваш файл cookie идентификатора сессии, который сбрасывается при каждом запросе.

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