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

Обработка Cookie Servlet

Cookie - это текстовые файлы, хранящиеся на клиентском компьютере, и сохраняющие различные отслеживающие данные. Java Servlet явно поддерживает HTTP Cookie.

Идентификация возвращаемого пользователя включает три шага:}}

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

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

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

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

Обработка Cookie в Servlet требует кодирования и декодирования китайского текста,方法是如下:

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

Анализ Cookie

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

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

Как вы видите, заголовок Set-Cookie содержит парное имя-значение, дату GMT, путь и домен. Имя и значение будут закодированы по URL. Поле expires является инструкцией, которая сообщает браузеру, чтобы "забыть" этот 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

Servlet может определить метод запроса request.getCookies() Доступ к cookie, этот метод возвращает Cookie Массив объектов.

Servlet Cookie Методы

Ниже приведен список полезных методов, которые можно использовать для работы с cookie в Servlet.

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

Настройка Куки через Servlet

Настройка Куки через Servlet включает три шага:

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

Cookie cookie = new Cookie("ключ","значение");

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

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

(2) Установить максимальный срок хранения:Вы можете использовать метод setMaxAge, чтобы指定 время действия куки (в секундах). Найдем куки с максимальным сроком действия 24 часа.

cookie.setMaxAge(60*60*24);

(3) Отправить Куки в заголовок HTTP ответа:Вы можете использовать response.addCookie добавить Куки в HTTP заголовок ответа, как показано ниже:

response.addCookie(cookie);

Онлайн пример

Давайте изменим наш Пример данных формыустановить Куки для имени и фамилии。

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
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;
/**
 * Класс реализации Servlet HelloServlet
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Автоматически сгенерированный конструктор
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // Создание Куки для имени и фамилии      
        Имя куки = новое Куки("имя",
                URLEncoder.encode(request.getParameter("name"), "UTF-8")); // Кодирование китайского текста
        Cookie url = new Cookie("url",
                      request.getParameter("url"));
        
        // Установить дату истечения срока действия двух Cookie через 24 часа
        name.setMaxAge(60*60*24); 
        url.setMaxAge(60*60*24); 
        
        // Добавить два Cookie в заголовок ответа
        response.addCookie(name);
        response.addCookie(url);
        
        // Установить тип содержимого ответа
        response.setContentType("text/html;charset=UTF-8");
        
        PrintWriter out = response.getWriter();
        String title = "Пример установки Cookie";
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor="#f0f0f0">\n"
                "<h1 align="center">" + title + "</h1>
" +
                "<ul>
" +
                "  <li><b>Название сайта:</b>"
                + request.getParameter("name") + "
</li>" +
                "  <li><b>URL сайта:</b>:"
                + request.getParameter("url") + "
</li>" +
                "</ul>
" +
                "</body></html>");
        }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Автоматически сгенерированный метод
        doGet(request, response);
    }
}

Компилируйте上面的 Servlet HelloFormи создайте соответствующие записи в файле web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- Имя класса -->  
    <servlet-name>HelloForm</servlet-name>
    <!-- Расположение пакета -->
    <servlet-class>com.w3codebox.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <!-- Видимый URL -->
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

Попробуйте следующие HTML-страницы для вызова Servlet.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Сайт основного руководства (oldtoolbag.com)</title>
</head>
<body>
<form action="/TomcatTest/HelloForm" method="GET">
Имя сайта:<input type="text" name="name">
<br />
URL сайта:<input type="text" name="url" /><br>
<input type="submit" value="Подтвердить" />
</form>
</body>
</html>

Сохраните вышеуказанный HTML-контент в файл /TomcatTest/test.html.

Далее мы посещаем http://localhost:8080/TomcatTest/test.html, демонстрация следующая:

После нажатия кнопки "Подтвердить" результат будет следующим:

Внимание:Некоторые из указанных выше путей необходимо изменить в зависимости от фактического пути вашего проекта.

Чтение куки через сервлет

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

Онлайн пример

Давайте прочитаем куки, установленные в примере выше

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
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;
/**
 * Класс реализации сервлета ReadCookies
 */
@WebServlet("/ReadCookies")
public class ReadCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        super();
        // TODO Автоматически сгенерированный конструктор
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // Получить массив Cookie, связанных с этим доменом
        cookies = request.getCookies();
         
         // Установить тип содержимого ответа
         response.setContentType("text/html;charset=UTF-8");
    
         PrintWriter out = response.getWriter();
         String title = "Удаление примера куки";
         String docType = "<!DOCTYPE html>\n";
         out.println(docType +
                   "<html>\n" +
                   "<head><title>" + title + "</title></head>\n" +
                   "<body bgcolor=\"#f0f0f0\">\n" +
          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("Параметр значения: " + URLDecoder.decode(cookie.getValue(), "utf-8") + "<br/>");
            }
         } else {
             out.println(
               "<h2 class=\"tutheader\">No Cookie founds</h2>
         }
         out.println("</body>");
         out.println("</html>");
        }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Автоматически сгенерированный метод
        doGet(request, response);
    }
}

Компилируйте上面的 Servlet ReadCookiesи создать соответствующую запись в файле web.xml. Попробуйте запустить http://localhost:8080/TomcatTest/ReadCookiesБудет отображаться следующим образом:


Удаление Cookie через Servlet

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

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

  • Использование setMaxAge() Метод устанавливает возраст cookie в ноль, чтобы удалить существующий cookie.

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

Онлайн пример

Ниже приведен пример, который удаляет существующий cookie с именем "url", когда вы следующего раза запустите Servlet ReadCookies, он вернет url как null.

package com.w3codebox.test;
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;
/**
 * Servlet implementation class DeleteCookies
 */
@WebServlet("/DeleteCookies")
public class DeleteCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DeleteCookies() {
        super();
        // TODO Автоматически сгенерированный конструктор
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // Получить массив Cookie, связанных с этим доменом
        cookies = request.getCookies();
        
            // Установить тип содержимого ответа
        response.setContentType("text/html;charset=UTF-8");
   
        PrintWriter out = response.getWriter();
        String title = "Пример удаления Cookie";
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                  "<html>\n" +
                  "<head><title>" + title + "</title></head>\n" +
                  "<body bgcolor=\"#f0f0f0\">\n" +
         if( cookies != null ){
           out.println("<h2>Имя и значение Cookie</h2>");
           for (int i = 0; i < cookies.length; i++){
              cookie = cookies[i];
              if((cookie.getName()).compareTo("url") == 0 ){
                   cookie.setMaxAge(0);
                   response.addCookie(cookie);
                   out.print("Удаленный cookie: " + 
                                cookie.getName() + "<br/>");
              }
              out.print("Название параметра: " + cookie.getName() + ",");
              out.print("Parameter value: " + cookie.getValue() + "<br/>");
           }
        } else {
            out.println(
              "<h2 class=\"tutheader\">No Cookie founds</h2>
        }
        out.println("</body>");
        out.println("</html>");
        }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Автоматически сгенерированный метод
        doGet(request, response);
    }
}

Компилируйте上面的 Servlet DeleteCookiesВ файле web.xml создайте соответствующие записи. Теперь запустите http://localhost:8080/TomcatTest/DeleteCookiesБудет отображаться следующим образом: