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

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

Какой из лучших среди них:

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

Ответы

Ответ 1

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

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

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

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

См. также:

Ответ 2

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

[EDIT] Существует два варианта: Cookies и специальный URL. Существуют проблемы с обоими подходами. Например, если вы кодируете сеанс в URL-адресе, люди могут попытаться передать сеанс (например, помещая URL-адрес в почту). Если вы хотите это понять, прочитайте пару статей о безопасности и постройте серверы приложений. В противном случае: ваш сервер приложений Java подойдет вам. Не думайте об этом.

Ответ 3

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

Ответ 4

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

1) URL-адрес запроса, например. jessionid =....
2) cookie

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

ИЗМЕНИТЬ. Существует не лучший вариант, есть спецификация сервлета, которая определяет способ.

Ответ 5

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

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

Существует три способа достижения этой цели:

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

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

Ответ 6

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

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

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

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

  • Установлено ли ваше приложение на одном сервере?

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

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