Лучший вариант для управления сеансами в 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 выполняется автоматически.
-
Установлено ли ваше приложение на одном сервере?
-
Если ДА, чем у вас нет проблем, используйте параметр сеанса сервлета.
-
если нет, вам нужно найти другой способ сделать это. Как использование липкого сеанса, или, возможно, проанализировать весь объект сеанса в запросах/ответах как поле. Этот вариант действительно требует от вас принятия мер безопасности.