English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 обычно устанавливаются в заголовке 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:
Номер | Метод & Описание |
---|---|
1 | public void setDomain(String pattern) Установить домен cookie, например oldtoolbag.com |
2 | public String getDomain() Получить домен cookie, например oldtoolbag.com |
3 | public void setMaxAge(int expiry) Установить срок действия cookie в секундах, по умолчанию срок действия равен времени жизни текущей сессии |
4 | public int getMaxAge() Получить срок действия cookie в секундах, по умолчанию -1, что означает, что cookie будет жить до закрытия браузера |
5 | public String getName() Возврат имени cookie, после создания имени cookie его нельзя изменить |
6 | public void setValue(String newValue) Установка значения cookie |
7 | public String getValue() Получение значения cookie |
8 | public void setPath(String uri) Установка пути cookie, по умолчанию это все URL в текущей директории и все подкаталоги этой директории |
9 | public String getPath() Получение пути cookie |
10 | public void setSecure(boolean flag) Указание, должен ли cookie быть зашифрован при передаче |
11 | public void setComment(String purpose) Установка комментария, описывающего цель cookie. Когда браузер показывает cookie пользователю, комментарий становится очень полезным |
12 | public String getComment() Возврат комментария, описывающего цель cookie, если его нет,则在озвращает null |
Использование 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, как показано ниже:
Попробуйте ввести "имя сайта" и "адрес сайта", затем нажмите кнопку отправки. Это покажет "имя сайта" и "адрес сайта" на вашем экране и установит два куки для "имя сайта" и "адрес сайта".
Чтобы читать 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>
После посещения браузером,результат будет:
Удаление 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.