3

## 3.9_(4.9) Куки

Куки представляют простейший способ хранения данных приложения.

Куки хранятся в браузере пользователя в виде пары ключ-значение: с каждым уникальным ключом сопоставляется определенное значение.

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

Куки могут быть двух типов. Одни куки хранятся только в течении сеанса. То есть когда пользователь закрывает вкладку браузера и прекращает работать с приложением, то куки сеанса уничтожаются. Второй тип куков - постоянные куки - хранятся в течение продолжительного времени (до 3 лет).

Следует учитывать некоторые ограничения. Прежде всего куки нередко ограничены по размеру (обычно не более 4 килобайт). Кроме того, обычно браузеры принимают не более 20 кук с одного сайта. Более того, в некоторых браузерах может быть отключена поддержка кук.

Для работы с куками сервлеты могут используют класс javax.servlet.http.Cookie.

Для создания куки надо создать объект этого класса с помощью констуктора Cookie(String name, String value), где name - ключ, а value - значение, которое сохраняется в куках. Стоит отметить, что мы можем сохранить в куках только строки.

Чтобы добавить куки в ответ клиенту у объекта HttpServletResponse применяется метод addCookie(Cookie c)

При создании куки мы можем использовать ряд методов объекта Cookie для установки и получения отдельных параметров:

· setMaxAge(int maxAgeInSeconds): устанавливает время в секундах, в течение которого будут существовать куки. Специальное значение -1 указывает, что куки будут существовать только в течение сессии и после закрытия браузера будут удалены.

· setValue(String value): устанавливает хранимое значение.

· getMaxAge(): возвращает время хранения кук.

· getName(): возвращает ключ кук.

· getValue(): возвращает значение кук.

Например, установка куки с названием "user" и значением "Tom":

`Cookie cookie = new` `Cookie("user", "Tom");` `response.addCookie``(cookie);`

Чтобы получить куки, которые приходят в запросе от клиента, применяется метод getCookies() класса HttpServletRequest.

Например, получение куки по имени:

`Cookie[] cookies = request.getCookies();`

`String cookieName = "user";`

`Cookie cookie = null;`

`if(cookies !=null) {`

`for(Cookie c: cookies) {`

`if(cookieName.equals(c.getName())) {`

`` `cookie``= c;`

`break;`

`}`

`}`

`}`

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

Например, определим сервлет SetServlet, который будет устанавливать куки:

`import` `java.io.IOException``;`

`import` `java.io.PrintWriter``;`

`import` `javax.servlet.ServletException``;`

`import` `javax.servlet.annotation.WebServlet``;`

`import` `javax.servlet.http.Cookie``;`

`import` `javax.servlet.http.HttpServlet``;`

`import` `javax.servlet.http.HttpServletRequest``;`

`import` `javax.servlet.http.HttpServletResponse``;`

`@WebServlet("/set")`

`public` `class` `SetServlet` `extends` `HttpServlet``{`

``

`protected` `void` `doGet``(HttpServletRequest request, HttpServletResponse response)`

`throws` `ServletException``, IOException {`

``

`PrintWriter out = response.getWriter();`

`try` `{`

`response.addCookie(new` `Cookie("user", "Tom"));`

`out.println("Cookie is set");`

`` `}`

`finally` `{`

`out.close();`

`}`

`}`

`}`

В данном случае устанавливается куки user, которая хранит строку "Tom".

Определим сервдет HelloServlet, который получает эту куку:

`import` `java.io.IOException``;`

`import` `java.io.PrintWriter``;`

`import` `javax.servlet.ServletException``;`

`import` `javax.servlet.annotation.WebServlet``;`

`import` `javax.servlet.http.Cookie``;`

`import` `javax.servlet.http.HttpServlet``;`

`import` `javax.servlet.http.HttpServletRequest``;`

`import` `javax.servlet.http.HttpServletResponse``;`

``

`@WebServlet("/hello")`

`public` `class` `HelloServlet` `extends` `HttpServlet``{`

``

`protected` `void` `doGet``(HttpServletRequest request, HttpServletResponse response)`

`throws` `ServletException``, IOException {`

``

``

`Cookie[] cookies = request.getCookies();`

`String cookieName = "user";`

`Cookie cookie = null;`

`if(cookies !=null) {`

`for(Cookie c: cookies) {`

`if(cookieName.equals(c.getName())) {`

`cookie = c;`

`break;`

`}`

`}`

`}`

`PrintWriter out = response.getWriter();`

`try` `{`

`out.println("Name: "` `+ cookie.getValue());`

`` `}`

`finally` `{`

`out.close();`

`}`

`}`

`}`

Таким образом, при обращении к сервлету SetServlet произойдет установка кук, а при обращении к сервлету HelloServlet мы получим установлены куки:

Назад Содержание вперёд