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

Tratamento de Cookies Servlet

Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。Java Servlet 显然支持 HTTP Cookie。

识别返回用户包括三个步骤:

  • 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。

  • 浏览器将这些信息存储在本地计算机上,以备将来使用。

  • 在下一次浏览器向 Web 服务器发送任何请求时,浏览器会将该代码信息发送到服务器,服务器将使用该信息来认证用户。

本章将将向您讲述如何设置或重置 Cookie,如何访问它们,以及如何删除它们。

Servlet Cookie 处理需要对中文连编与连码。方法如下。

String == java.net.URLEncoder.encode(“中文”,“UTF=8”)-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 define o domínio aplicável ao cookie, por exemplo, oldtoolbag.com.
2public String getDomain()
Este método obtém o domínio aplicável ao cookie, por exemplo, oldtoolbag.com.
3public void setMaxAge(int expiry)
Este método define o tempo de expiração do cookie (em segundos). Se não for definido assim, o cookie será válido apenas na sessão atual.
4public int getMaxAge()
Este método retorna o período de vida máxima do cookie (em segundos), por padrão,-1 Indica que o cookie continuará até que o navegador seja fechado.
5public String getName()
Este método retorna o nome do cookie. O nome não pode ser alterado após a criação.
6public void setValue(String newValue)
Este método define o valor associado ao cookie.
7public String getValue()
Este método obtém o valor associado ao cookie.
8public void setPath(String uri)
Este método define o caminho aplicável ao cookie. Se você não especificar o caminho, todos os URLs na mesma pasta do site (inclusive os subdiretórios) retornarão o cookie.
9public String getPath()
Este método obtém o caminho aplicável ao cookie.
10public void setSecure(boolean flag)
Este método define um valor booleano, indicando se o cookie deve ser enviado apenas em conexões encriptadas (ou seja, SSL).
11public void setComment(String purpose)
Defina o comentário do cookie. Este comentário é muito útil quando o navegador exibe o cookie para o usuário.
12public String getComment()
Obtenha o comentário do cookie, se o cookie não tiver comentário, retorne null.

Configuração de Cookie através de Servlet

A configuração de Cookie através de Servlet inclui três passos:

(1) Crie um objeto Cookie:Você pode chamar o construtor Cookie com o nome do cookie e o valor do cookie, ambos são strings.

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);

Exemplo online

让我们修改我们的 表单数据示例,为名字和姓氏设置 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-construtor gerado
    }
    /**
     * @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 );
        
        // Definir o tipo de conteúdo da resposta
        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") + /li>" +
                "  <li><b>站点 URL:</b>:"
                + request.getParameter("url") + /li>" +
                "</ul>\n" +
                "</body></html>");
        }
    /**
     * @ver HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-génrico método método
        doGet(request, response);
    }
}

Compile o Servlet acima HelloForme crie a entrada apropriada no arquivo web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet 
    <!-- Nome da classe -->  
    <servlet-name>HelloForm</servlet-name>
    <!-- o pacote onde está -->
    <servlet-class>com.w3codebox.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <!-- Endereço da URL visitada -->
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

Tente o seguinte página HTML para chamar o Servlet.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Site de Tutorial Básico(oldtoolbag.com)</title>/title>
</head>
<body>
<form action="/TomcatTest/HelloForm" method="GET">
Nome do site:<input type="text" name="name">
<br />
URL do site:<input type="text" name="url" /><br>
<input type="submit" value="Enviar" />
</form>
</body>
</html>

Salve o conteúdo HTML acima em um arquivo /TomcatTest/test.html.

A seguir, acessamos http://localhost:8080/TomcatTest/test.html, demonstração a seguir:

Após clicar no botão "Enviar", o efeito será como follows:

Atenção:Alguns dos caminhos acima precisam ser modificados de acordo com o caminho real do seu projeto.

Lendo Cookie pelo Servlet

Para ler Cookie, você precisa chamar HttpServletRequest do getCookies( ) método cria um javax.servlet.http.Cookie do array de objetos. Em seguida, percorra o array, usando os métodos getName() e getValue() para acessar cada cookie e o valor associado.

Exemplo online

Vamos ler o Cookie configurado no exemplo acima

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;
/**
 * Classe de implementação Servlet ReadCookies
 */
@WebServlet("/ReadCookies)
public class ReadCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        super();
        // TODO Auto-construtor gerado
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // Obter o array de Cookies relacionados com o domínio
        cookies = request.getCookies();
         
         // Definir o tipo de conteúdo da resposta
         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>Nome e valor do 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("Cookies deletados: ") + 
                                 cookie.getName( ) + "<br}}/>");
               }
               out.print("Nome do parâmetro: " + cookie.getName( ) + ",");
               out.print("Valor do parâmetro: " +  URLDecoder.decode(cookie.getValue(), "utf-8) +"<br/>");
            }
         }else{
             out.println(
               "<h2 class=\"tutheader\">Nenhum Cookie encontrado</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-génrico método método
        doGet(request, response);
    }
}

Compile o Servlet acima ReadCookiese crie a entrada apropriada no arquivo web.xml. Tente executar http://localhost:8080/TomcatTest/ReadCookiesMostrará o seguinte resultado:


Deletar Cookie através do Servlet

Deletar um cookie é muito simples. Se você quiser deletar um cookie, siga apenas os três passos a seguir:

  • Ler um cookie existente e armazená-lo no objeto Cookie.

  • Usar setMaxAge() O método define a idade do cookie como zero para deletar o cookie existente.

  • Adicione este cookie ao cabeçalho da resposta.

Exemplo online

A seguinte instância deletará o cookie existente chamado "url", quando você executar o Servlet ReadCookies novamente, ele retornará 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 implementation class DeleteCookies
 */
@WebServlet("/DeleteCookies)
public class DeleteCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DeleteCookies() {
        super();
        // TODO Auto-construtor gerado
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // Obter o array de Cookies relacionados com o domínio
        cookies = request.getCookies();
        
            // Definir o tipo de conteúdo da resposta
        response.setContentType("text/html;charset=UTF-8");
   
        PrintWriter out = response.getWriter();
        String title = "Exemplo de exclusão 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>Nome e valor do 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("Cookies deletados: ") + 
                                cookie.getName( ) + "<br}}/>");
              }
              out.print("Nome do parâmetro: " + cookie.getName( ) + ",");
              out.print("Valor do parâmetro: " + cookie.getValue( )+"<br/>");
           }
        }else{
            out.println(
              "<h2 class=\"tutheader\">Nenhum Cookie encontrado</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-génrico método método
        doGet(request, response);
    }
}

Compile o Servlet acima DeleteCookiesCrie uma entrada apropriada no arquivo web.xml. Agora execute http://localhost:8080/TomcatTest/DeleteCookiesMostrará o seguinte resultado: