Обработка файлов cookie и сеанс в сервлете Java
1. обзор
В этом руководстве мы рассмотримthe handling of cookies and sessions in Java, using Servlets.
Кроме того, мы кратко опишем, что такое файл cookie, и рассмотрим несколько примеров его использования.
2. Основы 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.
2.1. Создать файл cookie
КлассCookie определен в пакетеjavax.servlet.http.
Чтобы отправить его клиенту, нам нужноcreate one and add it to the response:
Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);
Однако его API намного шире - давайте рассмотрим его.
2.2. Установите дату истечения срока действия файлов cookie
Мы можем установить максимальный возраст (с помощью методаmaxAge(int)), который определяет, сколько секунд данный файл cookie должен быть действителен в течение:
uiColorCookie.setMaxAge(60*60);
Мы устанавливаем максимальный возраст до одного часа. По истечении этого времени файл cookie не может использоваться клиентом (браузером) при отправке запроса, и его также следует удалить из кэша браузера.
2.3. Установите домен 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 (без поддоменов).
Наряду с доменным именем, мы также можем указать путь. Давайте посмотрим на это дальше.
2.4. Установить путь для файлов cookie
Путь указывает, куда будет доставлен файл 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();
}
2.6. Удалить файл cookie
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.