Лучший вариант для управления сессиями в Java - PullRequest
52 голосов
/ 09 ноября 2009

Лучший способ управления сессиями в Java. Я слышал, что куки не являются надежным вариантом для этого, так как они хранятся в браузере и могут быть доступны позже? Это правильно? Если возможно, пожалуйста, дайте ответы с примером кодирования.

Что является лучшим среди:

  • Перезапись URL : Сервер добавит дополнительный параметр в конце ссылки URL
  • Скрытый параметр в форме : сервер добавит дополнительный параметр в каждую форму в HTML
  • cookie : сервер попросит браузер сохранить cookie.

Ответы [ 6 ]

67 голосов
/ 09 ноября 2009

Управление сеансом (идентификация клиента, обработка файлов cookie, сохранение данных области сеанса и т. Д.) В основном уже выполняется самим сервером приложений. Вам не нужно беспокоиться об этом вообще. Вы можете просто установить / получить объекты Java в сеансе с помощью HttpSession#setAttribute() и #getAttribute(). Единственное, о чем вам действительно нужно позаботиться, это перезапись URL , если клиент не поддерживает файлы cookie. Затем он добавит идентификатор jsessionid к URL. В JSP вы можете использовать для этого JSTL c:url. В сервлете вы можете использовать для этого HttpServletResponse#encodeURL(). Таким образом, сервер может идентифицировать клиента, прочитав URL нового запроса.

Ваш новый вопрос, вероятно, должен звучать так: «Но как куки связаны с этим? Как сервер все это делает?». Ответ таков: если сервер получает запрос от клиента, а серверный код (ваш код) пытается получить HttpSession по HttpServletRequest#getSession() в то время как пока никто не создан (первый запрос в новом сеансе), сервер сам создаст новый. Сервер сгенерирует длинный, уникальный и трудно угадываемый идентификатор (тот, который вы можете получить по HttpSession#getId()) и установите этот идентификатор в качестве значения файла cookie с именем jsessionid. Под капотом сервер использует для этого HttpServletResponse#addCookie(). Наконец, сервер будет хранить все сеансы в некотором виде Map с идентификатором сеанса в качестве ключа и HttpSession в качестве значения.

В соответствии со спецификацией HTTP cookie клиенту необходимо отправить те же куки обратно в заголовки последующего запроса. Под капотом сервер будет искать файл cookie jsessionid по HttpServletRequest#getCookies() и определять его значение. Таким образом, сервер может получить связанный HttpSession и вернуть его при каждом вызове на HttpServletRequest#getSession().

Кстати, единственное, что хранится на стороне клиента, - это идентификатор сеанса (в виде файла cookie), а объект HttpSession (включая все его атрибуты) хранится на стороне сервера (в Java). объем памяти). Вам не нужно беспокоиться об управлении сессиями, и вам не нужно беспокоиться о безопасности.

Смотри также:

6 голосов
/ 09 ноября 2009

Все веб-платформы Java поддерживают файлы cookie или идентификаторы сеансов в кодировке URL. Они автоматически выберут правильный подход, поэтому вам ничего не нужно делать. Просто запросите объект сеанса из вашего контейнера, и он обработает детали.

[РЕДАКТИРОВАТЬ] Есть два варианта: Cookies и специальный URL. Есть проблемы с обоими подходами. Например, если вы закодируете сеанс в URL, люди могут попытаться передать сеанс (например, поместив URL в сообщение). Если вы хотите понять это, прочитайте пару статей о безопасности и о создании серверов приложений. В противном случае: ваш сервер приложений Java будет делать то, что вам нужно. Не думай об этом.

4 голосов
/ 09 ноября 2009

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

2 голосов
/ 09 ноября 2009

Спецификация сервлета определяет API для доступа / настройки данных сеанса в стандартном приложении J2EE. Также он определяет, что данные сеанса хранятся на стороне сервера, и клиенту ничего не передается, кроме идентификатора сеанса. Существует 2 механизма передачи идентификатора сессии:

1) URL запроса, например jessionid = ....
2) печенье

Механизм определяется автоматически на основе возможностей клиента.

EDIT . Нет лучшего варианта, есть спецификация сервлета, которая определяет путь.

1 голос
/ 09 ноября 2009

Http - это протокол без учета состояния, только для протокола извлечения на стороне клиента.

Чтобы реализовать диалог с отслеживанием состояния через него, веб-серверу Java EE необходимо скрыть некоторую информацию (которая является sessionid) на стороне клиента, и механизм, который он может использовать, должен следовать спецификациям HTTP и HTML.

Есть три способа достичь этой цели:

  1. Перезапись URL : Сервер добавит дополнительный параметр в конце ссылки URL.
  2. Скрытый параметр в форме : сервер будет добавлять дополнительный параметр к каждой форме в HTML.
  3. cookie : сервер попросит браузер сохранить cookie.

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

0 голосов
/ 09 ноября 2009

2 важных вопроса:

  1. Какие веб-технологии вы используете? JSF, Struts, SpringMVC или просто сервлеты / JSP.

    • Сервлеты / JSP уже предоставляют необходимую поддержку сеанса.
      Пример JSP: Hello, <%= session.getAttribute( "theName" ) %>

    • Я действительно не думаю, что вам есть о чем беспокоиться о cookie-файлах, поскольку данные надежно хранятся на сервере, а управление cookie-файлами выполняется автоматически.

  2. Ваше приложение установлено на одном сервере?

    • Если ДА, у вас нет проблем, используйте параметр сеанса сервлета.

    • если НЕТ, тогда вам нужно найти другой способ сделать это. Например, использовать липкий сеанс или, возможно, анализировать весь объект сеанса в запросах / ответах как поле. Этот вариант действительно требует от вас принятия мер безопасности.

...