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