English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Cookies são arquivos de texto armazenados no cliente, que contêm uma grande quantidade de informações de traçamento. Baseado na tecnologia Servlet, o JSP claramente pode fornecer suporte para HTTP cookies.
Existem geralmente três passos para identificar clientes recorrentes:
O script do servidor envia uma série de cookies para o navegador. Por exemplo, nome, idade, número de ID, etc.
O navegador armazena essas informações localmente, para uso emergencial.
Quando o navegador enviar qualquer solicitação para o servidor pela próxima vez, ele enviará essas informações de cookie ao servidor, e o servidor usará essas informações para identificar o usuário ou fazer outras coisas.
Este capítulo ensinará como configurar ou reconfigurar cookies, bem como como acessá-los e como excluí-los.
O processamento de Cookie em JSP requer a codificação e decodificação de caracteres chineses, conforme a seguir:
String str = java.net.URLEncoder.encode("chinese", "UTF-8")-8); //Codificação String str = java.net.URLDecoder.decode("string codificada","UTF-8")-8); // Decodificação
Cookie 通常在 HTTP 信息头中设置(尽管 JavaScript 能够直接在浏览器中设置 cookie)。在 JSP 中,设置一个 cookie 需要发送如下信息头给服务器:
HTTP/1.1 200 OK Date: Fri, 04 Feb 2015 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=w3codebox; expires=Friday, 04-Feb-17 22:03:38 GMT; path=/; domain=oldtoolbag.com Connection: close Content-Type: text/html
正如您看到的,Set-Cookie 信息头包含一个键值对,一个 GMT(格林尼治标准时间)时间,一个路径,一个域名。键值对会被编码为 URL。有效期域是个指令,告诉浏览器在什么时候之后就可以清除这个 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
JSP 脚本通过 request 对象中的 getCookies() 方法来访问这些 cookie,这个方法会返回一个 Cookie 对象的数组。
下表列出了 Cookie 对象中常用的方法:
序号 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern) 设置 cookie 的域名,例如 oldtoolbag.com |
2 | public String getDomain() 取得 cookie 的域名,例如 oldtoolbag.com |
3 | public void setMaxAge(int expiry) Defina a validade do cookie, em segundos, o padrão é a vida útil da sessão atual |
4 | public int getMaxAge() Obtenha a validade do cookie, em segundos, o padrão é-1 Indica que o cookie viverá até que o navegador seja fechado |
5 | public String getName() Retorna o nome do cookie, o nome é criado e não pode ser modificado após a criação |
6 | public void setValue(String newValue) Defina o valor do cookie |
7 | public String getValue() Obtenha o valor do cookie |
8 | public void setPath(String uri) Defina o caminho do cookie, o padrão é todos os URL no diretório da página atual, bem como todos os subdiretórios deste diretório |
9 | public String getPath() Obtenha o caminho do cookie |
10 | public void setSecure(boolean flag) Indique se o cookie deve ser transmitido criptografado. |
11 | public void setComment(String purpose) Defina a descrição do comentário para o propósito do cookie. Isso pode ser muito útil quando o navegador exibe o cookie para o usuário. |
12 | public String getComment() Retorna um comentário descritivo do propósito do cookie, ou null se não houver. |
Usar JSP para configurar cookie envolve três passos:
(1) Criar um objeto cookie: Chame o construtor do cookie, usando um nome e valor de cookie como parâmetros, ambos strings.
Cookie cookie = new Cookie("key","value");
Certifique-se de que o nome e o valor não contenham espaços ou caracteres como os seguintes:
[ ] ( ) = , " / ? @ : ;
(2) Definir a validade:Chame a função setMaxAge() para indicar por quanto tempo (em segundos) o cookie será válido. As seguintes operações definiram a validade para: 24 horas.
cookie.setMaxAge(60*60*24);
(3Envie o cookie para o cabeçalho da resposta HTTP:Chame a função response.addCookie() para adicionar um cookie ao cabeçalho da resposta HTTP.
response.addCookie(cookie);
O código do arquivo main.jsp é o seguinte:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.net."*" %> <% // codificação, resolver o problema de caracteres chineses ilegíveis String str = URLEncoder.encode(request.getParameter("name"),"utf-8); // Configurar cookies name e url Cookie name = new Cookie("name", str); Cookie url = new Cookie("url", request.getParameter("url")); // Configurar o tempo de expiração do cookie para24horas. name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); // Adicionar cookie no cabeçalho da resposta response.addCookie(name); response.addCookie(url); %> <html> <head> <title>Configurar Cookie</title> </head> <body> <h1>Configurar Cookie</h1> <ul> <li><p><b>Nome do site:</b> <%= request.getParameter("name") %> </p></li> <li><p><b>Endereço do site:</b> <%= request.getParameter("url") %> </p></li> </ul> </body> </html>
A seguir, há um formulário HTML simples que envia dados do cliente para o arquivo main.jsp usando o método GET e configura cookies:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Site de Tutorial Básico(oldtoolbag.com)</title> </head> <body> <form action="main.jsp" method=GET> Nome do site: <input type="text" name="name"> <br /> Endereço do site: <input type="text" name="url" /> <input type="submit" value="Enviar" /> </form> </body> </html>
Salve o código HTML acima no arquivo test.htm.
Coloque este arquivo no diretório WebContent do projeto jsp atual (no mesmo diretório que o main.jsp).
Através do acesso a http://localhost:8080/testjsp/test.html envia dados do formulário para o arquivo main.jsp, conforme mostrado:
Tente inserir "Nome do site" e "Endereço do site", então clique no botão enviar, ele será exibido na sua tela "Nome do site" e "Endereço do site", e configurar os dois cookies de "Nome do site" e "Endereço do site".
Para ler um cookie, você precisa chamar o método request.getCookies() para obter um array de objetos javax.servlet.http.Cookie, então percorra esse array, usando os métodos getName() e getValue() para obter o nome e o valor de cada cookie.
Vamos ler o cookie do exemplo anterior, a seguir está o código do arquivo cookie.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.net."*" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Obter Cookie</title> </head> <body> <% Cookie cookie = null; Cookie[] cookies = null; // Obter dados de cookies, é um array cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> Procurar Nome e Valor do Cookie</h2}); for (int i = 0; i < cookies.length; i++} cookie = cookies[i]; out.print("Nome do parâmetro: "); + cookie.getName()); out.print("<br>); out.print("Valor do parâmetro: "); + URLDecoder.decode(cookie.getValue(), "utf-8) +"<br> out.print("------------------------------------<br> } } out.println("<h2>Não foi encontrado Cookie</h2}); } %> </body> </html>
Após a visita do navegador, o resultado de saída será:
Deletar cookie é muito simples. Se você quiser deletar um cookie, siga os passos a seguir:
Obter um cookie existente e armazená-lo no objeto Cookie.
Definir a validade do cookie como 0.
Adicionar novamente o cookie ao cabeçalho da resposta.
A seguir está um exemplo de como deletar um cookie chamado "name", quando você executar o cookie.jsp pela segunda vez, o name será null.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.net."*" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Obter Cookie</title> </head> <body> <% Cookie cookie = null; Cookie[] cookies = null; // Obter cookies do domínio atual, é um array cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> Procurar 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("Excluir Cookie: "); + cookie.getName( + "<br/}); } out.print("Nome do parâmetro: "); + cookie.getName()); out.print("<br>); out.print("Valor do parâmetro: "); + URLDecoder.decode(cookie.getValue(), "utf-8) +"<br> out.print("------------------------------------<br> } } out.println("<h2>Não foi encontrado Cookie</h2}); } %> </body> </html>
Acesse via navegador, o resultado de saída será:
Acesse novamente http://localhost:8080/testjsp/cookie.jsp, você obterá o seguinte resultado:
Você pode ver que o cookie chamado "name" já não existe.
Você também pode excluir manualmente os cookies no navegador. No navegador IE, clique em Ferramentas, selecione Opções da Internet, clique em Excluir Cookies para excluir todos os cookies.