1 added
1 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: java, enterprise, javaee, http-сессия, httpsession api, stateless, сессия, servlet, flag, javax.servlet.http.httpsession, httpsession getsession(boolean flag), httpsession getsession(), jsessionid, string getid(), httpsession, void setmaxinactiveinterval(int interval), url rewriting</p>
1
<p>Теги: java, enterprise, javaee, http-сессия, httpsession api, stateless, сессия, servlet, flag, javax.servlet.http.httpsession, httpsession getsession(boolean flag), httpsession getsession(), jsessionid, string getid(), httpsession, void setmaxinactiveinterval(int interval), url rewriting</p>
2
<p>В любом веб-приложении одним из краеугольных вопросов является поддержка клиентских сессий. Платформа<strong>JavaEE</strong>не исключение и для этих целей в ней существует специализированный<strong>HttpSession API</strong>, доступ к которому есть у любого веб-приложения, развёрнутого в некотором<strong>сервлет-контейнере</strong>. Что же из себя представляют эти самые сессии?</p>
2
<p>В любом веб-приложении одним из краеугольных вопросов является поддержка клиентских сессий. Платформа<strong>JavaEE</strong>не исключение и для этих целей в ней существует специализированный<strong>HttpSession API</strong>, доступ к которому есть у любого веб-приложения, развёрнутого в некотором<strong>сервлет-контейнере</strong>. Что же из себя представляют эти самые сессии?</p>
3
<p>Возможно, вам известно, что протокол<strong>HTTP</strong>и веб-серверы по природе своей являются<strong>stateless</strong>, и каждый новый запрос от клиента расценивается сервером как абсолютно новый, ничего не знающий об истории предшествующих обращений. Вы скажете, а как же тогда реализуются интернет-магазины, знающие о списке добавленных в корзину товаров своих покупателей?</p>
3
<p>Возможно, вам известно, что протокол<strong>HTTP</strong>и веб-серверы по природе своей являются<strong>stateless</strong>, и каждый новый запрос от клиента расценивается сервером как абсолютно новый, ничего не знающий об истории предшествующих обращений. Вы скажете, а как же тогда реализуются интернет-магазины, знающие о списке добавленных в корзину товаров своих покупателей?</p>
4
<h2>А что такое сессия?</h2>
4
<h2>А что такое сессия?</h2>
5
<p><strong>Сессия</strong>- это диалоговое состояние между клиентом и сервером, включающее информацию о предыдущих запросах клиента и ответах сервера. В силу того, что протокол и сами веб-сервера не обеспечивают сохранение состояния, то единственной возможностью для этого является передача всей необходимой информации о запросе в нём самом.</p>
5
<p><strong>Сессия</strong>- это диалоговое состояние между клиентом и сервером, включающее информацию о предыдущих запросах клиента и ответах сервера. В силу того, что протокол и сами веб-сервера не обеспечивают сохранение состояния, то единственной возможностью для этого является передача всей необходимой информации о запросе в нём самом.</p>
6
<p>Чтобы этого не делать, каждый запрос от данного клиента сервер ассоциирует с некоторой уникальной информацией об установленной сессии (идентификатор сессии), пробрасывая её в каждом запросе и ответе. Для передачи данного<strong>UID</strong>наиболее популярными являются такие способы, как использование пользовательских<strong>cookies</strong>, скрытые поля формы и передача непосредственно в адресе запроса.</p>
6
<p>Чтобы этого не делать, каждый запрос от данного клиента сервер ассоциирует с некоторой уникальной информацией об установленной сессии (идентификатор сессии), пробрасывая её в каждом запросе и ответе. Для передачи данного<strong>UID</strong>наиболее популярными являются такие способы, как использование пользовательских<strong>cookies</strong>, скрытые поля формы и передача непосредственно в адресе запроса.</p>
7
-
<p>При разработке веб-приложения, конечно, функцию генерации<strong>UID</strong>и последующей его передачи от клиента к серверу может взять на себя само приложение. Но тогда разработчик будет ответственен за все возможные обращения, каждый раз проверяя, а не забыл ли он передать это значение, при этом генерируя огромное количество<strong>boilerplate-кода</strong>.</p>
7
+
<p>При разработке веб-приложения, конечно, ��ункцию генерации<strong>UID</strong>и последующей его передачи от клиента к серверу может взять на себя само приложение. Но тогда разработчик будет ответственен за все возможные обращения, каждый раз проверяя, а не забыл ли он передать это значение, при этом генерируя огромное количество<strong>boilerplate-кода</strong>.</p>
8
<h2>Что же в Java Enterprise?</h2>
8
<h2>Что же в Java Enterprise?</h2>
9
<p>К великому счастью, разработчики<strong>JavaEE</strong>освобождены от такой рутины и выполнение данной задачи взвалено на плечи контейнера, в пределах которого развёрнуто приложение. Осталось понять, каким же образом он это делает?</p>
9
<p>К великому счастью, разработчики<strong>JavaEE</strong>освобождены от такой рутины и выполнение данной задачи взвалено на плечи контейнера, в пределах которого развёрнуто приложение. Осталось понять, каким же образом он это делает?</p>
10
<p>Работа с пользовательскими сессиями веб-приложений в<strong>JavaEE</strong>вынесена в раздел<strong>Servlet API</strong>и осуществляется средствами интерфейса javax.servlet.http.HttpSession, который предоставляет высокоуровневые методы работы с ними. Непосредственная реализация уже располагается в библиотеке<strong>servlet-api.jar</strong>используемого контейнера сервлетов и напрямую зависит от него. Существует два способа получения ссылки на объект пользовательского сеанса из объекта клиентского запроса javax.servlet.http.HttpServletRequest, используя методы<strong>Servlet API</strong>:</p>
10
<p>Работа с пользовательскими сессиями веб-приложений в<strong>JavaEE</strong>вынесена в раздел<strong>Servlet API</strong>и осуществляется средствами интерфейса javax.servlet.http.HttpSession, который предоставляет высокоуровневые методы работы с ними. Непосредственная реализация уже располагается в библиотеке<strong>servlet-api.jar</strong>используемого контейнера сервлетов и напрямую зависит от него. Существует два способа получения ссылки на объект пользовательского сеанса из объекта клиентского запроса javax.servlet.http.HttpServletRequest, используя методы<strong>Servlet API</strong>:</p>
11
<ol><li>HttpSession request.getSession(boolean create) - для ложного значения параметра<strong>create</strong>данный метод возвращает объект сессии, если он был создан у данного запроса, и<strong>null</strong>в противном случае; в случае истинного значения<strong>create</strong>данный метод равносилен методу п.2.</li>
11
<ol><li>HttpSession request.getSession(boolean create) - для ложного значения параметра<strong>create</strong>данный метод возвращает объект сессии, если он был создан у данного запроса, и<strong>null</strong>в противном случае; в случае истинного значения<strong>create</strong>данный метод равносилен методу п.2.</li>
12
<li>HttpSession request.getSession() - если сеанс не установлен, то контейнер его создаёт, иначе возвращает уже созданный объект сессии.</li>
12
<li>HttpSession request.getSession() - если сеанс не установлен, то контейнер его создаёт, иначе возвращает уже созданный объект сессии.</li>
13
</ol><p>В момент, когда сеанс установлен, сервлет-контейнер создаёт пользовательский<strong>cookie</strong>с именем<strong>JSESSIONID</strong>, значение которого содержит уникальный идентификатор сессии (это же значение можно получить методом<strong>String getId()</strong>объекта<strong>HttpSession</strong>). Наряду с этим, в рамках контейнера определяется дефолтное значение таймаута сессии - время неактивного состояния пользователя, приводящее к устареванию его сеанса связи с сервером.</p>
13
</ol><p>В момент, когда сеанс установлен, сервлет-контейнер создаёт пользовательский<strong>cookie</strong>с именем<strong>JSESSIONID</strong>, значение которого содержит уникальный идентификатор сессии (это же значение можно получить методом<strong>String getId()</strong>объекта<strong>HttpSession</strong>). Наряду с этим, в рамках контейнера определяется дефолтное значение таймаута сессии - время неактивного состояния пользователя, приводящее к устареванию его сеанса связи с сервером.</p>
14
<p>Данное значение конфигурируется на уровне контейнера сервлетов либо непосредственно в веб-приложении на уровне дескриптора развёртывания<strong>web.xml</strong>или непосредственным вызовом метода void setMaxInactiveInterval(int interval) у объекта сессии. Начиная с версии<strong>Servlet API 3.0</strong>, также можно задать и время жизни куки<strong>JSESSIONID</strong>в конфиге<strong>web.xml</strong>, уничтожение которой также приведёт к запросу на повторное установление сеанса между клиентом и сервером. Кусок дескриптора развертывания<strong>web.xml</strong>:</p>
14
<p>Данное значение конфигурируется на уровне контейнера сервлетов либо непосредственно в веб-приложении на уровне дескриптора развёртывания<strong>web.xml</strong>или непосредственным вызовом метода void setMaxInactiveInterval(int interval) у объекта сессии. Начиная с версии<strong>Servlet API 3.0</strong>, также можно задать и время жизни куки<strong>JSESSIONID</strong>в конфиге<strong>web.xml</strong>, уничтожение которой также приведёт к запросу на повторное установление сеанса между клиентом и сервером. Кусок дескриптора развертывания<strong>web.xml</strong>:</p>
15
<session-config> <!-- Timeout of inactivity in minutes --> <session-timeout>15</session-timeout> <cookie-config> <http-only>true</http-only> <path>/</path> <!-- Cookie lifetime in seconds --> <max-age>900</max-age> </cookie-config> </session-config><p><strong>А что же будет, если пользовательские "печеньки" запрещены на клиентской машине?</strong>Данный факт будет выявлен сервером автоматически и для поддержания сеанса будет использован механизм<strong>URL Rewriting</strong>, который позволяет передавать UID-сессии непосредственно в адресной строке, например так:</p>
15
<session-config> <!-- Timeout of inactivity in minutes --> <session-timeout>15</session-timeout> <cookie-config> <http-only>true</http-only> <path>/</path> <!-- Cookie lifetime in seconds --> <max-age>900</max-age> </cookie-config> </session-config><p><strong>А что же будет, если пользовательские "печеньки" запрещены на клиентской машине?</strong>Данный факт будет выявлен сервером автоматически и для поддержания сеанса будет использован механизм<strong>URL Rewriting</strong>, который позволяет передавать UID-сессии непосредственно в адресной строке, например так:</p>
16
http://www.mysite.com/MyApp/myservlet;jsessionid=1E6FEC0D14D044541DD84D2D013D29ED<p>А зачем они вообще нужны эти<strong>http-сессии</strong>и какие в принципе возможности они предоставляют - это уже отдельная тема.</p>
16
http://www.mysite.com/MyApp/myservlet;jsessionid=1E6FEC0D14D044541DD84D2D013D29ED<p>А зачем они вообще нужны эти<strong>http-сессии</strong>и какие в принципе возможности они предоставляют - это уже отдельная тема.</p>
17
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
17
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
18
18