Servlet: ejemplo de inicio y cierre de sesión con cookies

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: 

índice.html

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 :  

iniciar sesión.html

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:

GFGLoginServlet.java

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:

GFGProfileServlet.java

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: 

GFGLoutServlet.java

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *