Лучший вариант для управления сессиями в Java

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

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

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

6 ответов

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

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

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ. Нет лучшего варианта, есть спецификация сервлета, которая определяет путь.

Http - это протокол без сохранения состояния, только для клиентской стороны.

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам