English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 通常设置在 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 时可使用的一些有用方法列表。
序号 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern) Este método configura el dominio aplicable del cookie, por ejemplo, oldtoolbag.com. |
2 | public String getDomain() Este método obtiene el dominio aplicable del cookie, por ejemplo, oldtoolbag.com. |
3 | public 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. |
4 | public 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. |
5 | public String getName() Este método devuelve el nombre del cookie. El nombre no puede cambiarse después de su creación. |
6 | public void setValue(String newValue) Este método configura el valor asociado con el cookie. |
7 | public String getValue() Este método obtiene el valor asociado con el cookie. |
8 | public 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. |
9 | public String getPath() Este método obtiene la ruta aplicable del cookie. |
10 | public 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). |
11 | public void setComment(String purpose) Configurar el comentario del cookie. Este comentario es muy útil cuando el navegador presenta el cookie al usuario. |
12 | public String getComment() Obtener el comentario del cookie, si el cookie no tiene comentario, devuelve null. |
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);
让我们修改我们的 表单数据示例,为名字和姓氏设置 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.
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.
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 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.
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: