HTML Diff
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 &lt;session-config&gt; &lt;!-- Timeout of inactivity in minutes --&gt; &lt;session-timeout&gt;15&lt;/session-timeout&gt; &lt;cookie-config&gt; &lt;http-only&gt;true&lt;/http-only&gt; &lt;path&gt;/&lt;/path&gt; &lt;!-- Cookie lifetime in seconds --&gt; &lt;max-age&gt;900&lt;/max-age&gt; &lt;/cookie-config&gt; &lt;/session-config&gt;<p><strong>А что же будет, если пользовательские "печеньки" запрещены на клиентской машине?</strong>Данный факт будет выявлен сервером автоматически и для поддержания сеанса будет использован механизм<strong>URL Rewriting</strong>, который позволяет передавать UID-сессии непосредственно в адресной строке, например так:</p>
15 &lt;session-config&gt; &lt;!-- Timeout of inactivity in minutes --&gt; &lt;session-timeout&gt;15&lt;/session-timeout&gt; &lt;cookie-config&gt; &lt;http-only&gt;true&lt;/http-only&gt; &lt;path&gt;/&lt;/path&gt; &lt;!-- Cookie lifetime in seconds --&gt; &lt;max-age&gt;900&lt;/max-age&gt; &lt;/cookie-config&gt; &lt;/session-config&gt;<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