Учебники

Сервлеты — Обработка печенья

Куки-файлы — это текстовые файлы, которые хранятся на клиентском компьютере и хранятся в целях отслеживания различной информации. Сервлеты Java прозрачно поддерживают файлы cookie HTTP.

Есть три шага, вовлеченных в идентификацию возвращающихся пользователей —

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

  • Браузер хранит эту информацию на локальном компьютере для дальнейшего использования.

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

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

Браузер хранит эту информацию на локальном компьютере для дальнейшего использования.

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

В этой главе вы узнаете, как установить или сбросить файлы cookie, как получить к ним доступ и как их удалить.

Анатомия Печенья

Файлы cookie обычно устанавливаются в заголовке HTTP (хотя JavaScript также может устанавливать файлы cookie непосредственно в браузере). Сервлет, который устанавливает 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 = tutorialspoint.com
Connection: close
Content-Type: text/html

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

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

Servlet Cookies Методы

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

Sr.No. Метод и описание
1

public void setDomain (шаблон String)

Этот метод устанавливает домен, к которому применяется cookie, например, tutorialspoint.com.

2

public String getDomain ()

Этот метод получает домен, к которому применяется cookie, например, tutorialspoint.com.

3

public void setMaxAge (int expiry)

Этот метод устанавливает, сколько времени (в секундах) должно пройти до истечения срока действия cookie. Если вы не установите это, cookie будет длиться только для текущего сеанса.

4

public int getMaxAge ()

Этот метод возвращает максимальный возраст файла cookie, указанный в секундах. По умолчанию -1 указывает, что файл cookie будет сохраняться до завершения работы браузера.

5

public String getName ()

Этот метод возвращает имя куки. Имя не может быть изменено после создания.

6

public void setValue (String newValue)

Этот метод устанавливает значение, связанное с cookie

7

public String getValue ()

Этот метод получает значение, связанное с cookie.

8

public void setPath (String uri)

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

9

public String getPath ()

Этот метод получает путь, к которому применяется этот файл cookie.

10

public void setSecure (логический флаг)

Этот метод устанавливает логическое значение, указывающее, следует ли отправлять cookie-файлы только через зашифрованные (т. Е. SSL) соединения.

11

public void setComment (строковое назначение)

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

12

public String getComment ()

Этот метод возвращает комментарий, описывающий назначение этого файла cookie, или ноль, если файл cookie не имеет комментариев.

public void setDomain (шаблон String)

Этот метод устанавливает домен, к которому применяется cookie, например, tutorialspoint.com.

public String getDomain ()

Этот метод получает домен, к которому применяется cookie, например, tutorialspoint.com.

public void setMaxAge (int expiry)

Этот метод устанавливает, сколько времени (в секундах) должно пройти до истечения срока действия cookie. Если вы не установите это, cookie будет длиться только для текущего сеанса.

public int getMaxAge ()

Этот метод возвращает максимальный возраст файла cookie, указанный в секундах. По умолчанию -1 указывает, что файл cookie будет сохраняться до завершения работы браузера.

public String getName ()

Этот метод возвращает имя куки. Имя не может быть изменено после создания.

public void setValue (String newValue)

Этот метод устанавливает значение, связанное с cookie

public String getValue ()

Этот метод получает значение, связанное с cookie.

public void setPath (String uri)

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

public String getPath ()

Этот метод получает путь, к которому применяется этот файл cookie.

public void setSecure (логический флаг)

Этот метод устанавливает логическое значение, указывающее, следует ли отправлять cookie-файлы только через зашифрованные (т. Е. SSL) соединения.

public void setComment (строковое назначение)

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

public String getComment ()

Этот метод возвращает комментарий, описывающий назначение этого файла cookie, или ноль, если файл cookie не имеет комментариев.

Настройка Cookies с сервлетом

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

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

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

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

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

(2) Установка максимального возраста — вы используете setMaxAge, чтобы указать, как долго (в секундах) должен быть действителен cookie. Следующее настроило бы печенье на 24 часа.

cookie.setMaxAge(60 * 60 * 24); 

(3) Отправка Cookie в заголовки ответа HTTP — Вы используете response.addCookie для добавления файлов cookie в заголовок ответа HTTP следующим образом:

response.addCookie(cookie);

пример

Давайте изменим наш пример формы, чтобы установить файлы cookie для имени и фамилии.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class HelloForm extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Create cookies for first and last names.      
      Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
      Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));

      // Set expiry date after 24 Hrs for both the cookies.
      firstName.setMaxAge(60*60*24);
      lastName.setMaxAge(60*60*24);

      // Add both the cookies in the response header.
      response.addCookie( firstName );
      response.addCookie( lastName );

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Setting Cookies Example";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head>
               <title>" + title + "</title>
            </head>\n" +
            
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>
         </html>"
      );
   }
}

Скомпилируйте приведенный выше сервлет HelloForm и создайте соответствующую запись в файле web.xml и, наконец, попробуйте перейти на страницу HTML для вызова сервлета.

 
<html>
   <body>
      <form action = "HelloForm" method = "GET">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
   </body>
</html>

Сохраните содержимое HTML выше в файле Hello.htm и поместите его в каталог <Tomcat-installationdirectory> / webapps / ROOT. Когда вы обращаетесь к http: // localhost: 8080 / Hello.htm , вот фактический результат вышеприведенной формы.

Имя:
Фамилия:

Попробуйте ввести имя и фамилию, а затем нажмите кнопку «Отправить». Это будет отображать имя и фамилию на вашем экране, и в то же время будут установлены два куки firstName и lastName, которые будут переданы обратно на сервер, когда вы в следующий раз нажмете кнопку «Отправить».

В следующем разделе объясняется, как вы получите доступ к этим файлам cookie в своем веб-приложении.

Чтение куки с сервлетом

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

пример

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

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class ReadCookies extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      Cookie cookie = null;
      Cookie[] cookies = null;

      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Reading Cookies Example";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n" );

      if( cookies != null ) {
         out.println("<h2> Found Cookies Name and Value</h2>");

         for (int i = 0; i < cookies.length; i++) {
            cookie = cookies[i];
            out.print("Name : " + cookie.getName( ) + ",  ");
            out.print("Value: " + cookie.getValue( ) + " <br/>");
         }
      } else {
         out.println("<h2>No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Скомпилируйте приведенный выше сервлет ReadCookies и создайте соответствующую запись в файле web.xml. Если бы вы установили для cookie «first_name» значение «John», а для cookie «last_name» — «Player», то при запуске http: // localhost: 8080 / ReadCookies будет отображаться следующий результат:

Found Cookies Name and Value

Name : first_name, Value: John
Name : last_name, Value: Player

Удалить куки с сервлетом

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

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

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

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

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

Задайте возраст файла cookie равным нулю, используя метод setMaxAge (), чтобы удалить существующий файл cookie.

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

пример

В следующем примере удаляется существующий файл cookie с именем «first_name», и при следующем запуске сервлета ReadCookies в следующий раз он возвращает нулевое значение для first_name.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class DeleteCookies extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      Cookie cookie = null;
      Cookie[] cookies = null;
         
      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n" );
         
      if( cookies != null ) {
         out.println("<h2> Cookies Name and Value</h2>");

         for (int i = 0; i < cookies.length; i++) {
            cookie = cookies[i];

            if((cookie.getName( )).compareTo("first_name") == 0 ) {
               cookie.setMaxAge(0);
               response.addCookie(cookie);
               out.print("Deleted cookie : " + cookie.getName( ) + "<br/>");
            }
            out.print("Name : " + cookie.getName( ) + ",  ");
            out.print("Value: " + cookie.getValue( )+" <br/>");
         }
      } else {
         out.println("<h2>No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Скомпилируйте вышеуказанный сервлет DeleteCookies и создайте соответствующую запись в файле web.xml. Теперь при запуске http: // localhost: 8080 / DeleteCookies будет отображаться следующий результат —

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Теперь попробуйте запустить http: // localhost: 8080 / ReadCookies, и он отобразит только один файл cookie следующим образом:

Found Cookies Name and Value

Name : last_name, Value: Player

Вы можете удалить свои куки в Internet Explorer вручную. Начните с меню Сервис и выберите Свойства обозревателя. Чтобы удалить все куки, нажмите Удалить куки.