«1. Обзор

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

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

2. Основы использования файлов cookie

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

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

Более подробную информацию можно найти в этой статье.

2.1. Создание Cookie

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

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

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

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

2.2. Установите дату истечения срока действия файла cookie

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

uiColorCookie.setMaxAge(60*60);

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

2.3. Установка домена cookie

Другой полезный метод в API cookie — setDomain(String).

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

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

uiColorCookie.setDomain("example.com");

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

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

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

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

2.4. Установить путь к файлу cookie

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

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

uiColorCookie.setPath("/welcomeUser");

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

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

2.5. Чтение файлов 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();
}

2.6. Удалить файл cookie

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

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

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

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

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

3. Объект HttpSession

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

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

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

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

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

HttpSession session = request.getSession();

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

request.getSession(true)

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

request.getSession(false)

«

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

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

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

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

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

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

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

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

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

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

session.getAttribute("attributeKey");

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

session.removeAttribute("attributeKey");

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

session.invalidate();

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

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

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

4. Заключение

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

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