Руководство по Servlets. Работа с cookie.

В данной статье мы рассмотрим работу с cookie файлами при работе с сервлетами.

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

Сначала мы получим такую страницу:

servletCookieDemoEmpty

Но, после обновления, мы увидим следующее:

servletCookieDemoFull

На этом мы заканчиваем изучение cookie при работе с сервлетами.

В следующей статье мы рассмотрим доступ к БД с помощью сервлетов.