Servlets - manipulação de cookies
Cookies são arquivos de texto armazenados no computador cliente e são mantidos para vários fins de rastreamento de informações. Os Java Servlets suportam cookies HTTP de forma transparente.
Existem três etapas envolvidas na identificação de usuários recorrentes -
O script de servidor envia um conjunto de cookies para o navegador. Por exemplo, nome, idade ou número de identificação etc.
O navegador armazena essas informações na máquina local para uso futuro.
Da próxima vez que o navegador enviar qualquer solicitação ao servidor da web, ele enviará as informações dos cookies ao servidor e o servidor usará essas informações para identificar o usuário.
Este capítulo o ensinará como definir ou redefinir cookies, como acessá-los e como excluí-los.
A anatomia de um biscoito
Os cookies geralmente são definidos em um cabeçalho HTTP (embora o JavaScript também possa definir um cookie diretamente em um navegador). Um servlet que define um cookie pode enviar cabeçalhos parecidos com este -
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
Como você pode ver, o cabeçalho Set-Cookie contém um par nome-valor, uma data GMT, um caminho e um domínio. O nome e o valor serão codificados por URL. O campo expira é uma instrução para o navegador "esquecer" o cookie após a data e hora fornecidas.
Se o navegador estiver configurado para armazenar cookies, ele manterá essas informações até a data de expiração. Se o usuário apontar o navegador para qualquer página que corresponda ao caminho e domínio do cookie, ele reenviará o cookie ao servidor. Os cabeçalhos do navegador podem ser parecidos com isto -
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
Um servlet terá então acesso ao cookie por meio do método de solicitação request.getCookies () que retorna uma matriz de objetos Cookie .
Métodos de Cookies Servlet
A seguir está uma lista de métodos úteis que você pode usar ao manipular cookies no servlet.
Sr. Não. | Método e Descrição |
---|---|
1 | public void setDomain(String pattern) Este método define o domínio ao qual o cookie se aplica, por exemplo tutorialspoint.com. |
2 | public String getDomain() Este método obtém o domínio ao qual o cookie se aplica, por exemplo tutorialspoint.com. |
3 | public void setMaxAge(int expiry) Este método define quanto tempo (em segundos) deve decorrer antes que o cookie expire. Se você não definir isso, o cookie durará apenas para a sessão atual. |
4 | public int getMaxAge() Este método retorna a idade máxima do cookie, especificada em segundos, por padrão, -1 indicando que o cookie irá persistir até o desligamento do navegador. |
5 | public String getName() Este método retorna o nome do cookie. O nome não pode ser alterado após a criação. |
6 | public void setValue(String newValue) Este método define o valor associado ao cookie |
7 | public String getValue() Este método obtém o valor associado ao cookie. |
8 | public void setPath(String uri) Este método define o caminho ao qual este cookie se aplica. Se você não especificar um caminho, o cookie será retornado para todos os URLs no mesmo diretório da página atual, bem como para todos os subdiretórios. |
9 | public String getPath() Este método obtém o caminho ao qual este cookie se aplica. |
10 | public void setSecure(boolean flag) Este método define o valor booleano que indica se o cookie deve ser enviado apenas por conexões criptografadas (ou seja, SSL). |
11 | public void setComment(String purpose) Este método especifica um comentário que descreve a finalidade de um cookie. O comentário é útil se o navegador apresentar o cookie ao usuário. |
12 | public String getComment() Este método retorna o comentário que descreve a finalidade deste cookie, ou null se o cookie não tiver nenhum comentário. |
Configurando Cookies com Servlet
Definir cookies com servlet envolve três etapas -
(1) Creating a Cookie object - Você chama o construtor Cookie com um nome de cookie e um valor de cookie, sendo que ambos são strings.
Cookie cookie = new Cookie("key","value");
Lembre-se de que nem o nome nem o valor devem conter espaço em branco ou qualquer um dos seguintes caracteres -
[ ] ( ) = , " / ? @ : ;
(2) Setting the maximum age- Use setMaxAge para especificar por quanto tempo (em segundos) o cookie deve ser válido. A seguir configuraria um cookie por 24 horas.
cookie.setMaxAge(60 * 60 * 24);
(3) Sending the Cookie into the HTTP response headers - Use response.addCookie para adicionar cookies no cabeçalho de resposta HTTP da seguinte forma -
response.addCookie(cookie);
Exemplo
Vamos modificar nosso exemplo de formulário para definir os cookies para o nome e o sobrenome.
// 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>"
);
}
}
Compile o servlet acima HelloForm e crie a entrada apropriada no arquivo web.xml e, finalmente, tente seguir a página HTML para chamar o servlet.
<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>
Mantenha o conteúdo HTML acima em um arquivo Hello.htm e coloque-o no diretório <Tomcat-installationdirectory> / webapps / ROOT. Quando você acessa http: // localhost: 8080 / Hello.htm , aqui está a saída real do formulário acima.
Tente inserir o nome e o sobrenome e clique no botão enviar. Isso exibiria o nome e o sobrenome na tela e, ao mesmo tempo, definiria dois cookies firstName e lastName, que seriam passados de volta para o servidor na próxima vez em que você pressionasse o botão Enviar.
A próxima seção explicaria como você acessaria esses cookies em seu aplicativo da web.
Lendo Cookies com Servlet
Para ler cookies, você precisa criar uma matriz de objetos javax.servlet.http.Cookie chamando ogetCookies()método de HttpServletRequest . Em seguida, percorra o array e use os métodos getName () e getValue () para acessar cada cookie e valor associado.
Exemplo
Vamos ler os cookies que definimos no exemplo anterior -
// 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>");
}
}
Compilar o servlet acima ReadCookiese crie a entrada apropriada no arquivo web.xml. Se você tivesse definido o cookie first_name como "John" e o cookie last_name como "Player", executar http: // localhost: 8080 / ReadCookies exibiria o seguinte resultado -
Found Cookies Name and Value
Name : first_name, Value: John
Name : last_name, Value: Player
Apagar Cookies com Servlet
Excluir cookies é muito simples. Se você deseja excluir um cookie, basta seguir as três etapas seguintes -
Leia um cookie já existente e armazene-o no objeto Cookie.
Defina a idade do cookie como zero usando setMaxAge() método para excluir um cookie existente
Adicione este cookie de volta ao cabeçalho da resposta.
Exemplo
O exemplo a seguir excluiria um cookie existente chamado "first_name" e quando você executasse o servlet ReadCookies na próxima vez, ele retornaria um valor nulo para 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>");
}
}
Compilar o servlet acima DeleteCookiese crie a entrada apropriada no arquivo web.xml. Agora, executando http: // localhost: 8080 / DeleteCookies exibiria o seguinte resultado -
Cookies Name and Value
Deleted cookie : first_name
Name : first_name, Value: John
Name : last_name, Value: Player
Agora tente executar http: // localhost: 8080 / ReadCookies e ele exibirá apenas um cookie da seguinte forma -
Found Cookies Name and Value
Name : last_name, Value: Player
Você pode excluir seus cookies manualmente no Internet Explorer. Comece no menu Ferramentas e selecione Opções da Internet. Para excluir todos os cookies, pressione Excluir Cookies.