English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Обработка cookie JSP

Cookie хранятся в текстовом файле на клиентском компьютере и содержат大量的 следовой информации. На основе технологии Servlet JSP显然 может обеспечить поддержку HTTP cookie.

Обычно для идентификации постоянных клиентов используется три шага:

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

  •             Браузер хранит эти данные на локальном компьютере для возможного использования в будущем.

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

Эта глава научит вас, как устанавливать или изменять cookie, а также как к ним обращаться и как удалять их.

Обработка Cookie в JSP требует кодирования и декодирования китайских символов, способ выполнения которых следующий:

String str = java.net.URLEncoder.encode("中文", "UTF-8"); // кодирование
String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8"); // декодирование

Анализ Cookie

Cookie обычно устанавливаются в заголовке HTTP-информации (хотя JavaScript может напрямую устанавливать cookie в браузере). В JSP для установки cookie необходимо отправить следующие заголовки информации серверу:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2015 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=w3codebox; expires=Friday, 04-Feb-17 22:03:38 GMT; 
                 path=/; domain=oldtoolbag.com
Connection: close
Content-Type: text/html

Как вы видите, заголовок Set-Cookie содержит пару ключ-значение, время GMT (格林вичский стандартное время), путь и домен. Пара ключ-значение будет закодирована в URL. Срок действия домена - это команда, которая сообщает браузеру, когда можно удалить этот cookie.

Если браузер настроен на хранение cookie, он сохранит эти данные до их истечения срока действия. Если пользователь посещает страницу, которая соответствует пути и домену в cookie, браузер повторно отправит этот cookie серверу. Информация заголовка на стороне браузера выглядит следующим образом:

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1, *, utf-8
Cookie: name=xyz

JSP скрипт доступ к этим cookie через метод getCookies() объекта request, который возвращает массив объектов Cookie.

    Методы Cookie в Servlet

В таблице ниже перечислены常用的 методы объекта Cookie:

НомерМетод & Описание
                1public void setDomain(String pattern) Установить домен cookie, например oldtoolbag.com
                2public String getDomain() Получить домен cookie, например oldtoolbag.com
                3public void setMaxAge(int expiry) Установить срок действия cookie в секундах, по умолчанию срок действия равен времени жизни текущей сессии
                4public int getMaxAge() Получить срок действия cookie в секундах, по умолчанию -1, что означает, что cookie будет жить до закрытия браузера
                5public String getName() Возврат имени cookie, после создания имени cookie его нельзя изменить
                6public void setValue(String newValue) Установка значения cookie
                7public String getValue() Получение значения cookie
                8public void setPath(String uri) Установка пути cookie, по умолчанию это все URL в текущей директории и все подкаталоги этой директории
                9public String getPath() Получение пути cookie
                10public void setSecure(boolean flag) Указание, должен ли cookie быть зашифрован при передаче
                11public void setComment(String purpose) Установка комментария, описывающего цель cookie. Когда браузер показывает cookie пользователю, комментарий становится очень полезным
                12public String getComment() Возврат комментария, описывающего цель cookie, если его нет,则在озвращает null

Настройка cookie с использованием JSP

Использование JSP для настройки cookie включает в себя три шага:

(1) Создание объекта cookie: Вызов конструктора cookie с параметрами cookie-имени и значения, которые являются строками.

Cookie cookie = new Cookie("key","value");

Убедитесь, что в названии и значении cookie не должно быть пробелов или таких символов:

[ ] ( ) = , " / ? @ : ;

(2) Установка срока действия:Вызов функции setMaxAge() указывает, в течение какого времени (в секундах) cookie будет действителен. Следующие действия устанавливают срок действия на 24 часа.

cookie.setMaxAge(60*60*24);

(3) Отправка cookie в заголовок HTTP ответа:Использование функции response.addCookie() для добавления cookie в заголовок HTTP ответа.

response.addCookie(cookie);

Пример

main.jsp файл кода представлен следующим образом:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%
<%@ page import="java.net.*" %>
<%
   // 编码,解决中文乱码   
   String str = URLEncoder.encode(request.getParameter("name"),"utf-8");  
   // 设置 name 和 url cookie 
   Cookie name = new Cookie("name",
           str);
   Cookie url = new Cookie("url",
              request.getParameter("url));
   // Установка времени жизни куки 24 часа.
   name.setMaxAge(60*60*24); 
   url.setMaxAge(60*60*24); 
   // Добавление куки в заголовок ответа
   response.addCookie(name);
   response.addCookie(url);
%>
<html>
<head>
<title>Настройка Cookie</title>
</head>
<body>
<h1>Настройка Cookie</h1>
<ul>
<li><p><b>Имя сайта:</b>
   <%= request.getParameter("name") %>
</p></li>
<li><p><b>Адрес сайта:</b>
   <%= request.getParameter("url") %>
</p></li>
</ul>
</body>
</html>

Ниже приведен пример простого HTML формуляра, который отправляет клиентские данные в файл main.jsp с помощью метода GET и устанавливает куки:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Сайт базовых учебников (oldtoolbag.com)</title>
</head>
<body>
<form action="main.jsp" method=GET>
Имя сайта: <input type="text" name="name">
<br />
Адрес сайта: <input type="text" name="url" />
<input type="submit" value="Отправить" />
</form>
</body>
</html>

Сохраните этот HTML код в файле test.htm.

Поместите этот файл в текущую директорию WebContent вашего jsp проекта (в одной директории с main.jsp).

Подайте данные формы в файл main.jsp через http://localhost:8080/testjsp/test.html, как показано ниже:

Попробуйте ввести "имя сайта" и "адрес сайта", затем нажмите кнопку отправки. Это покажет "имя сайта" и "адрес сайта" на вашем экране и установит два куки для "имя сайта" и "адрес сайта".

Использование JSP для чтения куки

Чтобы читать cookie,вам нужно вызвать метод request.getCookies() чтобы получить массив объектов javax.servlet.http.Cookie,затем пройти по этому массиву,используя методы getName() и getValue() чтобы получить имя и значение каждого cookie.

Пример

Давайте прочитайте cookie из предыдущего примера,ниже приведен код файла cookie.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Получение Cookie</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Получение данных cookies,является массивом
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> Поиск Cookie имени и значения</h2>");
      for (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
        
         out.print("Имя параметра: " + cookie.getName());
         out.print("<br>");
         out.print("Значение параметра: " + URLDecoder.decode(cookie.getValue(), "utf-8") + "<br>");
         out.print("------------------------------------<br>");
      }
  }
      out.println("<h2>Не найдено Cookie</h2>");
  }
%>
</body>
</html>

После посещения браузером,результат будет: 

    Использование JSP для удаления cookie

Удаление cookie очень просто.Если вы хотите удалить cookie,просто следуйте следующим шагам:

  •             Получите существующий cookie и храните его в объекте Cookie.

  •             Установите срок срока деятельности cookie равным 0.

  •             Добавьте этот cookie заново в заголовки ответа.

Пример

Ниже программа удаляет cookie с именной "name",при вторичном запуске cookie.jsp name будет равен null。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Получение Cookie</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Получение cookies текущего домена,является массивом
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> Поиск Cookie имени и значения</h2>");
      for (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
         if(((cookie.getName( )).compareTo("name") == 0 )){
            cookie.setMaxAge(0);
            response.addCookie(cookie);
            out.print("Удалить Cookie: " + 
            cookie.getName() + "<br/>");
         }
         out.print("Имя параметра: " + cookie.getName());
         out.print("<br>");
         out.print("Значение параметра: " + URLDecoder.decode(cookie.getValue(), "utf-8") + "<br>");
         out.print("------------------------------------<br>");
      }
  }
      out.println("<h2>Не найдено Cookie</h2>");
  }
%>
</body>
</html>

При доступе через браузер результат будет следующим:

Повторный доступ к http://localhost:8080/testjsp/cookie.jsp приведет к следующим результатам:

Теперь cookie с именем "name" исчез.

Вы также можете вручную удалить cookie в браузере. В браузере IE нажмите на меню Tools (Инструменты), затем выберите Internet Options (Параметры Интернета), нажмите Delete Cookies (Удалить cookie), чтобы удалить все cookie.