Las cookies son una pieza de información textual que se almacena en formato de par clave-valor en el navegador del cliente durante múltiples requests.
¿Por qué usamos cookies?
- Usamos Cookies como una de las técnicas de Seguimiento de Sesión/Gestión de Estado .
- El seguimiento de sesiones es una forma de mantener el estado (datos) de un usuario . También se conoce como Gestión del Estado.
- Usamos el seguimiento de sesiones porque HTTP es un protocolo sin estado . En sin estado, el servidor trata cada solicitud como una nueva solicitud porque no recordará que el mismo cliente envía las requests.
- Por lo tanto, al usar cookies, podemos crear un módulo de inicio/cierre de sesión y el servidor puede almacenar nuestros datos.
Funcionamiento de una cookie
- El cliente envía una solicitud » req1 » al servidor. Después de procesar la solicitud “req1”, el servidor envía “ respuesta+cookies ”.
- Estas cookies se guardan en el navegador del cliente.
- Ahora, si el cliente envía otra solicitud » req2+cookies » al servidor, primero el servidor verificará la cookie y sabrá que este es un usuario que ya ha iniciado sesión y no tratará esta solicitud «req2+cookies» como una nueva solicitud. Luego, el servidor realizará un procesamiento adicional.
- Así es como se establecerá un estado.
¿Cómo usar cookies en Java?
- Para crear cookies, use la clase Cookies en el paquete javax.servlet.http .
- Para hacer una cookie, cree un objeto de la clase cookie y pase un par de nombre y valor.
¿Cómo adjuntar una cookie a una respuesta?
- Para adjuntar una cookie a una respuesta, utilice el método addCookie(cookie) de la interfaz de respuesta .
¿Cómo recuperar una cookie cuando un cliente envía otra solicitud (es decir, req2+cookie)?
- La cookie llegará a través de una solicitud, por lo que recibiremos ayuda del objeto de la solicitud .
- El método request.getCookies() devolverá una array de cookies .
- Los métodos getName() y getValue() de la clase Cookie se utilizan para obtener la clave y su valor correspondiente de la array de cookies.
- Si no se encuentran cookies , devolverá un valor nulo, lo que significa que el cliente es un usuario nuevo y la solicitud también es nueva.
¿Cómo eliminar una cookie?
- Se elimina una cookie para cerrar la sesión del usuario.
- En el par clave-valor, pase una string vacía .
- Además, use el método setMaxAge() de la clase Cookie para indicar cuánto tiempo debe expirar la cookie.
Nota: Para ejecutar los siguientes programas, el autor creó un proyecto web dinámico en Eclipse IDE y lo ejecutó con Apache Tomcat Server v9.0.
Ejemplo: módulo de inicio y cierre de sesión usando cookies
A. Archivo: index.html
- Esta página incluye enlaces a otras tres páginas para la navegación: página de inicio de sesión, servlet de cierre de sesión y servlet de perfil.
- Haga clic en login.html e ingrese el nombre de usuario y la contraseña (es decir, gfg). Desde la página de inicio de sesión, será redirigido a GFGLoginServlet.java
Ejemplo:
HTML
<!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>GFG</title> </head> <body> <p> <a href="login.html" style="font-size:25px;">Login |</a> <a href="GFGLogoutServlet" style="font-size:25px;"> Logout |</a> <a href="GFGProfileServlet" style="font-size:25px;"> Profile </a> </p> </body> </html>
Salida: index.html es el siguiente:
B. Archivo: enlace.html
link.html es lo mismo que index.html porque incluiremos el contenido de la página link.html usando RequestDispatcher en GFGLoginServlet.java y GFGLogoutServlet.java
Ejemplo:
HTML
<!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>GFG</title> </head> <body> <p> <a href="login.html" style="font-size:25px;">Login |</a> <a href="GFGLogoutServlet" style="font-size:25px;"> Logout |</a> <a href="GFGProfileServlet" style="font-size:25px;"> Profile </a> </p> </body> </html>
C. Archivo: inicio de sesión.html
HTML
<!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>GFG</title> </head> <body> <form action="GFGLoginServlet"> <pre> User name: <input type="text" name="user_name" placeholder="Enter your name"> Password: <input type="password" name="password" placeholder="Enter password"> <button type="submit" value="login">Login</button> </pre> </form> </body> </html>
Salida: login.html es el siguiente :
Implementación:
Caso: GFGLoginServlet.java
- Aquí, se comprobará la contraseña.
- Si la contraseña es correcta (es decir, gfg), se creará una cookie .
- De lo contrario, se mostrará el contenido de login.html pidiéndole al usuario que inicie sesión nuevamente ya que la contraseña era incorrecta.
- El contenido de link.html se mostrará en la parte superior en cualquier caso.
Java
// Java Program to Illustrate Login in Servlets // Importing required classes 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; // Annotation @WebServlet("/GFGLoginServlet") // Class // Extending HttpServlet class public class GFGLoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); request.getRequestDispatcher("link.html") .include(request, response); // This statement includes // link.html in this servlet String name = request.getParameter("user_name"); String password = request.getParameter("password"); if (password.equals("gfg")) { out.println( "<h1>Welcome " + name + ", you have successfully logged in!</h1>"); // creating cookie Cookie c = new Cookie("username", name); // attaching cookie to response object response.addCookie(c); } else { out.println( "Sorry invalid username or password!"); request.getRequestDispatcher("login.html") .include(request, response); // Above statement includes login.html for the // user to re-login if username or password is // invalid. } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
Salida: GFGLoginServlet.java es el siguiente:
GFGProfileServlet.java
- Aquí, acceder a la página de perfil significa enviar otra solicitud al usuario (es decir, req2+cookie).
- Si la cookie no existe (es decir, es nula), se mostrará el contenido de login.html pidiéndole al usuario que inicie sesión.
- De lo contrario, la cookie se recuperará mediante la función getName() y el nombre de la cookie requerida (es decir, el nombre de usuario) coincidirá. Al encontrar el nombre de la cookie, el valor de la cookie se obtendrá mediante la función getValue() .
- El contenido de link.html no se mostrará en esta página.
Java
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; @WebServlet("/GFGProfileServlet") public class GFGProfileServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); String name = ""; // request object will return an array of cookies Cookie[] cookies = request.getCookies(); if (cookies == null) { out.println( "<h1> You are a new user, kindly login. </h1>"); request.getRequestDispatcher("login.html") .include(request, response); // Above statement includes login.html for the // user to re-login if username or password is // invalid. } else { for (Cookie c : cookies) { String tempName = c.getName(); // For every cookie, add // cookie name to the // tempName. if (tempName.equals("username")) // If tempName and username (that we had set // in the cookie c in GFGLoginServlet) are // same, then this is an already logged in // user and the request is not from a new // user. So let the user access profile page. { name = c.getValue(); // From the (name, // value) pair of // cookie, fetch // value out.println( "<a href='GFGLogoutServlet' style='font-size:25px;'>Logout </a>"); out.println( "<h1>Welcome to your profile, " + name); } } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
Salida: GFGProfileServlet.java es el siguiente:
Caso: GFGLogoutServlet.java
- Aquí, la cookie se eliminará para finalizar la sesión.
- Junto con el nombre de la cookie (es decir, el nombre de usuario), se pasará el valor nulo.
- Dentro de la función setMaxAge(), estableceremos la fecha de caducidad de la cookie, para especificar después de cuánto tiempo caducará la cookie.
- Usando la función response.addCookie(), adjuntaremos esta cookie con la respuesta para enviarla al navegador del cliente.
Ejemplo
Java
// Java Program to Illustrate Logout in Servlets // Importing required classes 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; // Annotation @WebServlet("/GFGLogoutServlet") // Class // Extending HttpServlet class public class GFGLogoutServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); request.getRequestDispatcher("link.html") .include(request, response); // This statement includes // link.html in this servlet // cookie with blank value is used to delete // a cookie to sign out the user Cookie c = new Cookie("username", ""); // setMaxAge will set the expiration of cookie. // This cookie will expire in 0seconds c.setMaxAge(0); // Attach cookie to response response.addCookie(c); out.println("<h1>You have logged out!</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
Salida: GFGLogoutServlet.java es el siguiente:
Nota: Mientras ejecuta el módulo, si el usuario hace clic en «Perfil» cuando no ha iniciado sesión, en ese caso, el usuario será redirigido a login.html y no podrá acceder al perfil ya que la sesión no está creado.
Excepciones
- <espacio> no está permitido en las cookies.
- Si intentamos enviar «Geeks» como valor de cookie, es aceptable.
- Pero «Geeks for Geeks» arrojará una IllegalArgumentException porque <espacio> no está permitido en las cookies.
- «Geeks_for_Geeks» está permitido.
Publicación traducida automáticamente
Artículo escrito por nishatiwari1719 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA