HTTP сессия

Август 12, 2011

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

На платформе J2EE предусмотрено 3 механизма для поддержания сеанса по протоколу http: на основе cookie, на основе URL (URL rewriting) и на основе ср-в, предусмотренных протоколом SSL (Secure Socket Layer) — протокол сеансового уровня, который м. исп-ть совместно с http. По умолчанию используется механизм на основе cookie. Для идентификации каждого сеанса каждого пользовтеля веб-контейнер генерирует уникальный идент-р и создает свой объект типа javax.servlet.http.HttpSession, к-рый в нем хранится.

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

Механизм на основе URL (URL rewriting) заключается в том, что ид-р сессии прикрепляется к URL в виде get-параметра с именем jsessionid. Этот механизм работает даже тогда, когда cookie отключены. Однако при этом необх-мо внедрять соответствующий get-параметр во все ссылки, ведущие к тому же приложению во всех генерируемых им страницах ответов. Для включения ид-ра сессии в состав URL предусм. спец. метод encodeURL. С помощью этого метода д. обрабатываться все ссылки, к-рые присутствуют на всех страницах ответов.

Протокол SSL предусм. встроенный механизм для поддержания сессии. Он м. используется совместно с протоколом http в случае взаимодействия с веб-контейнером по зашифрованному каналу.

Если запрос не отн-ся ни к одному из существующих сеансов, то начин-ся новый. При этом генерируется идентификатор сессии и созд-ся объект типа javax.servlet.http.HttpSession, в составе которого хранится идентификатор сессии на сервере и который обычно прикрепляется к ответу в виде cookie. Браузер, получив cookie в составе ответа сохраняет ее и потом прикрепляет ее к каждому запросу, к-рый отправляется на тот сервер, с к-рого она была получена. Веб-контейнер, извлекая ид-р сессии из запроса, м. определить, к какому сеансу работы отн-ся этот запрос.

Если в браузере cookie отключены, а веб-приложения не исп-ют URL-rewriting, то каждый запрос такого клиента приводит к созд-ию каждый раз нового сеанса.

Слабая связанность веб-клиента и веб-контейнера требует применения таймаута как единственного надежного ср-ва д/определения момента окончания сеанса работы польз-ля с веб-приложением. По умолчанию прин-ся таймаут в 30 минут. Если в течение таймаута не было обращений от польз-ля, то сеанс этого польз-ля счит-ся завершенным. Соотв-ий объект сессии уничт-ся, а ид-р сессии стан-ся недействительным.

Получить объект сессии м. методом getSession инт-са HttpServletRequest. В этом инт-се есть также метод, к-рый позволяет узнать именно тот ид-р сессии, к-рый пришел с запросом (к моменту получения запроса он м.б. и недействительным), — это метод getRequestSessionId, а также узнать, был ли он передан вместе с cookie (метод isRequestedSessionIdFromCookie) или как get-параметр в составе URL (метод isRequestedSessionIdFromURL). Метод isRequestedSessionIdValid позволяет проверить, вышел ли таймаут сессии, индикатор которой был передан с запросом, или нет.

Интерфейс javax.servlet.http.HttpSession содержат методы, которые позволяют узнать все параметры сессии и работать с атрибутами сессии:

getId — возвр-ет ид-р сессии; getCreationTime — возвр-ет момент создания сессии; getLastAccessedTime — возвр-ет момент последнего обращ-ия польз-ля в рамках этого сеанса; getMaxInactiveInterval — возвращает таймаут сессии; isNew — проверяет, была ли создана сессия при поступлении данного запроса или нет; setMaxInactiveInterval — позв. установить величину таймаута.

Объект сессии так же, как и ServletContext и ServletRequest, м. выступать в роли контейнера д/других объектов-атрибутов. Время жизни атрибутов сессии ограничено временем сеанса работы польз-ля с веб-приложением. Атрибуты сессии — это основной механизм для сохранения информации на сервере м/у обращениями одного и того же пользователя в рамках одного сеанса работы с веб-приложением. Н-р, в виде атрибутов сессии сохр-ют ссылки на Statefull Session beans.
___________________________________________
Не каждый может позволить себе купить мужские золотые часы по дорогой цене! Зато каждый может подсмотреть часы по дешевле, но такие красивые и элегантные. Признак галантного мужчины во все времена были — фрак, сигара и золотые часы. Покупайте мужики!