Cookie – это текстовый файл, который хранится на локальной машине клиента и содержит различную информацию, которая используется для отслеживания различных данных.
Для того, чтобы определить конкретного пользователя, нам необходимо:
- Отправить набор данных cookie в браузер клиента.
- Браузер сохраняет эту информацию на локальной машине.
- При отправке запроса на сервер, клиент также отправляет данные из cookie-файла, которые относятся к этому серверу.
Обычно, cookie передаются в заголовке HTTP-сообщения.
Например:
HTTP/1.1 200 OK
Date: Fri, 27 March 2000 11:08:57 GMT
Server: nginx
Set-Cookie: user_id=100500; path=/; domain=proselyte.net
Connection: close
Content-Type: text/html
Мы имеем возможность определять, какие именно данные мы хотим сохранить в cookie-файле.
Для этого мы можем использовать класс Cookie.
Данный класс содержит следующие методы:
№ | Метод и его описание |
---|---|
1 | public void setDomain(String pattern) Устанавливает домен запроса, например, proselyte.net/ |
2 | public String getDomain() Возвращает домен запроса, например, proselyte.net |
3 | public void setValue(String newValue) Устанавливает значение cookie. |
4 | public String getValue() Возвращает значение cookie. |
5 | public String getName() Возвращает имя cookie. |
6 | public void setMaxAge(int expiry) Устанавливает максимальное время в секундах, после которого cookie перестанут быть валидными. |
7 | public int getMaxAge() Возвращает максимальное время в секундах, после которого cookie перестанут быть валидными. |
8 | public void setPath(String uri) Устанавливает путь cookie. |
9 | public String getPath() Возвращает путь cookie. |
10 | public void setSecure(boolean flag) Указывает, должны ли cookie передаваться только по защищенному соединению. |
11 | public void setComment(String purpose) Устанавливает комментарий, который описывает cookie. |
12 | public String getComment() Возвращает комментарий, который описывает cookie. |
Для понимания того, как это работает на практике, рассмотрим простой пример.
За основу возьмем пример из данной статьи.
Класс CookieDemo
package net.proselyte.servletstutorial;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* Simple Servlet that demonstrates work with {@link Cookie} class.
*
* @author Eugene Suleimanov
*/
public class CookieDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie sessionId = new Cookie("session_id", request.getRemoteAddr() + new Date().toString());
Cookie language = new Cookie("language", request.getLocale().toString());
response.addCookie(sessionId);
response.addCookie(language);
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
String title = "Cookies Demo";
String docType = "
<
!DOCTYPE html
>
";
Cookie[] cookies = request.getCookies();
writer.println(docType + "
<
html
>
<
head
>
<
title
>
" + title + "
<
/title
>
<
/head
>
<
body
>
");
if (cookies != null) {
writer.println("Cookies");
for (int i = 0; i
<
cookies.length; i++) {
writer.println("
<
hr/
>
");
writer.println("Name: " + cookies[i].getName());
writer.println("
<
br/
>
");
writer.println("Value: " + cookies[i].getValue());
writer.println("
<
hr/
>
");
}
} else {
writer.println("No cookies");
}
writer.println("
<
/body
>
<
/html
>
");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Файл web.xml
<
!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"
>
<
web-app
>
<
display-name
>
Servlets Tutorial
<
/display-name
>
<
servlet
>
<
servlet-name
>
SimpleServlet
<
/servlet-name
>
<
servlet-class
>
net.proselyte.servletstutorial.SimpleServlet
<
/servlet-class
>
<
/servlet
>
<
servlet
>
<
servlet-name
>
CookieDemo
<
/servlet-name
>
<
servlet-class
>
net.proselyte.servletstutorial.CookieDemo
<
/servlet-class
>
<
/servlet
>
<
servlet-mapping
>
<
servlet-name
>
SimpleServlet
<
/servlet-name
>
<
url-pattern
>
/SimpleServlet
<
/url-pattern
>
<
/servlet-mapping
>
<
servlet-mapping
>
<
servlet-name
>
CookieDemo
<
/servlet-name
>
<
url-pattern
>
/CookieDemo
<
/url-pattern
>
<
/servlet-mapping
>
<
/web-app
>
Выполним в консоли следующую команду:
mvn tomcat7:run
И перейдем по ссылке:
http://localhost:8088/CookieDemo
Сначала получим такую страницу:
Но, после обновления, мы увидим следующее: