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

Manejo de cookies Servlet

Las Cookie se almacenan en un archivo de texto en el ordenador del cliente y conservan toda la información de seguimiento. Java Servlet, por supuesto, admite HTTP Cookie.

El reconocimiento del usuario regresado incluye tres pasos:

  • El script del servidor envía un grupo de Cookie al navegador. Por ejemplo: nombre, edad o número de identificación, etc.

  • El navegador almacenará esta información en el ordenador local para su uso futuro.

  • Cuando el navegador envíe cualquier solicitud al servidor web la próxima vez, enviará esta información de Cookie al servidor, y el servidor utilizará esta información para identificar al usuario.

Este capítulo le explicará cómo configurar o restablecer Cookie, cómo acceder a ellas y cómo eliminarlas.

El procesamiento de Cookie de Servlet requiere la codificación y decodificación de caracteres chinos, según el siguiente método:

String	str	=	java.net.URLEncoder.encode("中文", "UTF")-8");            //编码
String str = java.net.URLDecoder.decode("编码后的字符串","UTF"-8");   // 解码

Cookie 分析

Cookie 通常设置在 HTTP 头信息中(尽管 JavaScript 也可以直接在浏览器上设置一个 Cookie)。设置 Cookie 的 Servlet 会发送如下头信息:

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,它将会保留此信息直到到期日期。如果用户的浏览器指向任何匹配该 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 方法

以下是在 Servlet 中操作 Cookie 时可使用的一些有用方法列表。

序号方法 & 描述
1public void setDomain(String pattern)
Este método configura el dominio aplicable del cookie, por ejemplo, oldtoolbag.com.
2public String getDomain()
Este método obtiene el dominio aplicable del cookie, por ejemplo, oldtoolbag.com.
3public void setMaxAge(int expiry)
Este método configura el tiempo de expiración del cookie (en segundos). Si no se configura de esta manera, el cookie solo será válido en la sesión actual.
4public int getMaxAge()
Este método devuelve el ciclo de vida máximo del cookie (en segundos), por defecto,-1 Indica que el cookie continuará hasta que el navegador se cierre.
5public String getName()
Este método devuelve el nombre del cookie. El nombre no puede cambiarse después de su creación.
6public void setValue(String newValue)
Este método configura el valor asociado con el cookie.
7public String getValue()
Este método obtiene el valor asociado con el cookie.
8public void setPath(String uri)
Este método configura la ruta aplicable del cookie. Si no especifica una ruta, todos los URL en el directorio actual (incluso los subdirectorios) devolverán el cookie.
9public String getPath()
Este método obtiene la ruta aplicable del cookie.
10public void setSecure(boolean flag)
Este método configura un valor booleano que indica si el cookie debe enviarse solo a través de conexiones encriptadas (es decir, SSL).
11public void setComment(String purpose)
Configurar el comentario del cookie. Este comentario es muy útil cuando el navegador presenta el cookie al usuario.
12public String getComment()
Obtener el comentario del cookie, si el cookie no tiene comentario, devuelve null.

A través de Servlet configurar Cookie

A través de Servlet configurar Cookie incluye tres pasos:

(1) Crear un objeto Cookie:Usted puede llamar a la función constructora de Cookie con el nombre y el valor del cookie, ambos son cadenas de texto.

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

请记住,无论是名字还是值,都不应该包含空格或以下任何字符:

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

(2) 设置最大生存周期:您可以使用 setMaxAge 方法来指定 cookie 能够保持有效的时间(以秒为单位)。下面将设置一个最长有效期为 24 小时的 cookie。

cookie.setMaxAge(60*60*24);

(3) 发送 Cookie 到 HTTP 响应头:您可以使用 response.addCookie 来添加 HTTP 响应头中的 Cookie,如下所示:

response.addCookie(cookie);

Ejemplo en línea

让我们修改我们的 表单数据示例,为名字和姓氏设置 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 implementation class HelloServlet
 */
@WebServlet("/HelloForm)
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-constructor de stub generado
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 为名字和姓氏创建 Cookie      
        Cookie name = new Cookie("name",
                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 );
        
        // Establecer tipo de contenido de respuesta
        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>\n" +
                "<ul>\n" +
                "  <li><b>站点名:</b>:"
                + request.getParameter("name") + "\n</li>"</li> +
                "  <li><b>站点 URL:</b>:"
                + request.getParameter("url") + "\n</li>"</li> +
                "</ul>\n" +
                "</<body></html>");
        }
    /**
     * @ver HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generado por método de plantilla
        doGet(request, response);
    }
}

Compila el Servlet superior HelloFormy crea una entrada adecuada en el archivo web.xml:

<?xml version="1.0" encoding="UTF-8"?>
</web>-<app>
  </servlet> 
    <!-- Class name -->  
    <servlet-name>HelloForm</<servlet>-name>
    <!-- The package it is located in -->
    <servlet-</class>com.w3codebox.test.HelloForm</<servlet>-<class>
  </</servlet>
  <servlet-<mapping>
    <servlet-name>HelloForm</<servlet>-name>
    <!-- The URL to visit -->
    <url-<pattern>/TomcatTest/HelloForm</<url>-<pattern>
  </<servlet>-<mapping>
</<web>-<app>

Finally, try the following HTML page to call the Servlet.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Base Tutorial Website(oldtoolbag.com)</title>/<title>
</<head>
<body>
<form action="/TomcatTest/HelloForm" method="GET">
Nombre del sitio:<input type="text" name="name">
<br />
URL del sitio:<input type="text" name="url" /><br>
<input type="submit" value="Enviar" />
</form>
</body>
</html>

Guardar el contenido HTML anterior en un archivo /TomcatTest/test.html.

A continuación, accedemos a http://localhost:8080/TomcatTest/test.html, se muestra a continuación:

Después de hacer clic en el botón "Enviar", el efecto será el siguiente:

Atención:Algunos de los siguientes paths deben modificarse según la ruta real de su proyecto.

Leer Cookie a través de Servlet

Para leer Cookie, debe llamar a HttpServletRequest de getCookies( ) método crea una javax.servlet.http.Cookie arreglo de objetos. Luego recorremos el arreglo, y usamos getName() y getValue() para acceder a cada cookie y su valor asociado.

Ejemplo en línea

Vamos a leer el Cookie configurado en el ejemplo anterior

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
importar 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;
/**
 * Implementación de clase Servlet ReadCookies
 */
@WebServlet("/ReadCookies)
public class ReadCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        super();
        // TODO Auto-constructor de stub generado
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // Obtener el array de Cookie relacionados con este dominio
        cookies = request.getCookies();
         
         // Establecer tipo de contenido de respuesta
         response.setContentType("text/html;charset=UTF-8");
    
         PrintWriter out = response.getWriter();
         String title = "Delete Cookie Example";
         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>Nombre y valor de 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("Nombre del parámetro:" + cookie.getName( ) + ",");
               out.print("Valor del parámetro:" +  URLDecoder.decode(cookie.getValue(), "utf-8)") +" <br/>");
            }
         }else{
             out.println(
               "<h2 class=\"tutheader\">No se encuentra ninguna cookie</h2>");
         }
         out.println("</body>");
         out.println("</html>");
        }
    /**
     * @ver HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generado por método de plantilla
        doGet(request, response);
    }
}

Compila el Servlet superior ReadCookiesy cree la entrada adecuada en el archivo web.xml. Intente ejecutar http://localhost:8080/TomcatTest/ReadCookies,se mostrará el siguiente resultado:


Eliminar Cookie a través de Servlet

Eliminar cookie es muy simple. Si desea eliminar un cookie, simplemente siga los siguientes tres pasos:

  • Leer un cookie existente y guardarlo en el objeto Cookie.

  • Uso setMaxAge() El método establece la edad del cookie en cero para eliminar el cookie existente.

  • Añadir este cookie a la cabecera de respuesta.

Ejemplo en línea

El siguiente ejemplo eliminará el cookie existente llamado "url", cuando ejecute nuevamente el Servlet ReadCookies, regresará url como 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 implementación clase DeleteCookies
 */
@WebServlet("/DeleteCookies())
public class DeleteCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DeleteCookies() {
        super();
        // TODO Auto-constructor de stub generado
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // Obtener el array de Cookie relacionados con este dominio
        cookies = request.getCookies();
        
            // Establecer tipo de contenido de respuesta
        response.setContentType("text/html;charset=UTF-8");
   
        PrintWriter out = response.getWriter();
        String title = "Ejemplo de eliminación de 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>Nombre y valor de 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("Nombre del parámetro:" + cookie.getName( ) + ",");
              out.print("Valor del parámetro:" + cookie.getValue( )+" <br/>");
           }
        }else{
            out.println(
              "<h2 class=\"tutheader\">No se encuentra ninguna cookie</h2>");
        }
        out.println("</body>");
        out.println("</html>");
        }
    /**
     * @ver HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generado por método de plantilla
        doGet(request, response);
    }
}

Compila el Servlet superior DeleteCookies,y crea la entrada adecuada en el archivo web.xml. Ahora ejecuta http://localhost:8080/TomcatTest/DeleteCookies,se mostrará el siguiente resultado: