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

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

1. обзор

В этом руководстве мы рассмотримthe handling of cookies and sessions in Java, using Servlets.

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

Проще говоря,a cookie is a small piece of data stored on the client-side which servers use when communicating with clients.

They’re used to identify a client при отправке последующего запроса. Их также можно использовать для передачи некоторых данных из одного сервлета в другой.

Для получения дополнительных сведений см.to this article.

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

Чтобы отправить его клиенту, нам нужноcreate one and add it to the response:

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

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

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

uiColorCookie.setMaxAge(60*60);

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

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

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

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

uiColorCookie.setDomain("example.com");

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

If we don’t specify a domain explicitly, it will be set to the domain namewhich created a cookie.

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

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

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

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

uiColorCookie.setPath("/welcomeUser");

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

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

2.5. Читать файлы cookie в сервлете

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

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

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

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

Toremove a cookie from a browser, we have to add a new one to the response with the same name, but with a maxAge value set to 0:

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

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

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

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

3. HttpSession Объект

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

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

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

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

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

HttpSession session = request.getSession();

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

request.getSession(true)

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

request.getSession(false)

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

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

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

3.2. АтрибутыSession

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

  • 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 не имеет состояния, поэтому поддержание состояния между запросами является обязательным.

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