Перейти к основному содержимому

Обработка файлов cookie и сеанса в сервлете Java

· 5 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим обработку файлов cookie и сеансов в Java с помощью сервлетов .

Кроме того, мы кратко опишем, что такое файл cookie, и рассмотрим несколько примеров его использования.

Проще говоря, файл cookie — это небольшой фрагмент данных, хранящийся на стороне клиента, который серверы используют при общении с клиентами .

Они используются для идентификации клиента при отправке последующего запроса. Их также можно использовать для передачи некоторых данных от одного сервлета к другому.

Для получения более подробной информации, пожалуйста, обратитесь к этой статье .

Класс Cookie определен в пакете javax.servlet.http . ``

Чтобы отправить его клиенту, нам нужно создать его и добавить в ответ :

Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);

Однако его API намного шире — давайте рассмотрим его.

Мы можем установить максимальный возраст (с помощью метода maxAge(int) ), который определяет, сколько секунд данный файл cookie должен быть действителен:

uiColorCookie.setMaxAge(60*60);

Мы устанавливаем максимальный возраст в один час. По истечении этого времени cookie не может использоваться клиентом (браузером) при отправке запроса и также должен быть удален из кеша браузера.

Еще один полезный метод в Cookie API — setDomain(String) .

Это позволяет нам указать доменные имена, на которые он должен быть доставлен клиентом. Это также зависит от того, указываем ли мы доменное имя явно или нет.

Установим домен для куки:

uiColorCookie.setDomain("example.com");

Файл cookie будет доставляться по каждому запросу, сделанному сайтом example.com и его поддоменами.

Если мы не укажем домен явно, он будет установлен на доменное имя , которое создало файл cookie .

Например, если мы создадим куки с example.com и оставим доменное имя пустым, то он будет доставлен на www.example.com (без субдоменов).

Наряду с доменным именем мы также можем указать путь. Давайте посмотрим на это дальше.

Путь указывает, куда будет доставлен файл cookie.

Если мы укажем путь явно, то Cookie будет доставлен на указанный URL и все его подкаталоги:

uiColorCookie.setPath("/welcomeUser");

Неявно он будет установлен на URL-адрес, который создал файл cookie и все его подкаталоги.

Теперь давайте сосредоточимся на том, как мы можем получить их значения внутри сервлета .

Файлы cookie добавляются к запросу клиентом. Клиент проверяет свои параметры и решает, может ли он доставить их по текущему URL-адресу.

Мы можем получить все файлы cookie, вызвав getCookies() для запроса ( HttpServletRequest ), переданного сервлету .

Мы можем перебирать этот массив и искать нужный нам, например, сравнивая их имена:

public Optional<String> readCookie(String key) {
return Arrays.stream(request.getCookies())
.filter(c -> key.equals(c.getName()))
.map(Cookie::getValue)
.findAny();
}

Чтобы удалить cookie из браузера, мы должны добавить новый в ответ с тем же именем, но со значением maxAge , равным 0 :

Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);

Примером использования для удаления файлов cookie является действие пользователя при выходе из системы — нам может потребоваться удалить некоторые данные, которые были сохранены для активного сеанса пользователя.

Теперь мы знаем, как обрабатывать файлы cookie внутри сервлета .

Далее мы рассмотрим еще один важный объект, к которому мы очень часто обращаемся из сервлета – объект сеанса .

3. Объект HttpSession

HttpSession — это еще один вариант хранения пользовательских данных для разных запросов. Сеанс — это хранилище на стороне сервера, содержащее контекстные данные.

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

Сеанс сопоставляется с клиентом с помощью файла cookie или параметров запроса. Дополнительную информацию можно найти здесь .

3.1. Получение сеанса

Мы можем получить HttpSession прямо из запроса:

HttpSession session = request.getSession();

Приведенный выше код создаст новый сеанс, если он не существует. Мы можем добиться того же, позвонив:

request.getSession(true)

Если мы просто хотим получить существующую сессию, а не создавать новую, нам нужно использовать:

request.getSession(false)

Если мы обращаемся к странице JSP в первый раз, по умолчанию создается новый сеанс. Мы можем отключить это поведение, установив для атрибута сеанса значение false:

<%@ page contentType="text/html;charset=UTF-8" session="false" %>

В большинстве случаев веб-сервер использует файлы cookie для управления сеансом. Когда создается объект сеанса, сервер создает файл cookie с ключом и значением JSESSIONID , который идентифицирует сеанс.

3.2. Атрибуты сеанса

Объект сеанса предоставляет набор методов для доступа (создания, чтения, изменения, удаления) атрибутов, созданных для данного сеанса пользователя:

  • setAttribute(String, Object), который создает или заменяет атрибут сеанса ключом и новым значением.
  • getAttribute(String) , который считывает значение атрибута с заданным именем (ключом)
  • removeAttribute(String) , который удаляет атрибут с заданным именем

Мы также можем легко проверить уже существующие атрибуты сеанса, вызвав getAttributeNames() .

Как мы уже упоминали, мы можем получить объект сеанса из запроса. Когда он у нас уже есть, мы можем быстро выполнить методы, упомянутые выше.

Мы можем создать атрибут:

HttpSession session = request.getSession();
session.setAttribute("attributeKey", "Sample Value");

Значение атрибута можно получить по его ключу (имени):

session.getAttribute("attributeKey");

Мы можем удалить атрибут, когда он нам больше не нужен:

session.removeAttribute("attributeKey");

Известным вариантом использования сеанса пользователя является аннулирование всех данных, которые он хранит, когда пользователь выходит из нашего веб-сайта. Объект сеанса предоставляет для него решение:

session.invalidate();

Этот метод удаляет весь сеанс с веб-сервера, поэтому мы больше не можем получить доступ к его атрибутам.

Объект HttpSession имеет больше методов, но те, которые мы упомянули, являются наиболее распространенными.

4. Вывод

В этой статье мы рассмотрели два механизма, которые позволяют нам сохранять пользовательские данные между последующими запросами к серверу — cookie и сеанс.

Имейте в виду, что протокол HTTP не имеет состояния, поэтому поддержание состояния между запросами является обязательным.

Как всегда, фрагменты кода доступны на Github .