Servlet: ejemplo de inicio y cierre de sesión de HttpSession

En general, el término “Sesión” en lenguaje informático, se refiere a un período de tiempo en el que ocurre la actividad de un usuario en un sitio web. Siempre que inicie sesión en una aplicación o un sitio web, el servidor debe validar/identificar al usuario y realizar un seguimiento de las interacciones del usuario en la aplicación. Para lograr esto, Java Web Server admite la interfaz de sesión estándar de servlet, llamada HttpSession, para realizar todas las actividades relacionadas con la sesión.

Interfaz HttpSession

Los servlets de Java tienen HttpSession (I) en el paquete javax.servlet.http. Esta interfaz proporciona una forma de identificar a un usuario en más de una página de requests o visitar un sitio web. El contenedor de servlet usa esta interfaz para crear una sesión entre un cliente HTTP y un servidor HTTP y almacena información sobre ese usuario. Proporciona varios métodos para manipular la información sobre una sesión, como por ejemplo,

  • Para vincular un objeto de sesión con un usuario específico.
  • Para obtener el tiempo de creación.
  • Para saber la última vez que el usuario accedió al sitio web en esa sesión.
  • Para invalidar la sesión, etc.

Crear una sesión

Una vez que el usuario inicia sesión en el sitio web, debemos crear una nueva sesión. Para hacer esto, necesitamos usar el método getSession() en la interfaz HttpServletRequest.

1) HttpSession getSession():

Java

HttpSession session = request.getSession();

Este método devuelve la sesión actual asociada con esta solicitud. Si la solicitud no tiene una sesión, crea una. También podemos crear una sesión usando el método getSession(boolean create) en la interfaz HttpServletRequest.

2) HttpSession getSession (creación booleana):

Podemos pasar los parámetros booleanos: verdadero o falso.

getSession(verdadero):

Java

HttpSession session = request.getSession(true);

Este método es el mismo que getSession(), donde devuelve la sesión actual asociada con esta solicitud. Si la solicitud no tiene una sesión, crea una.

getSession(falso):

Java

HttpSession session = request.getSession(false);

Este método devuelve la sesión actual asociada con esta solicitud. Si la solicitud no tiene una sesión, devuelve nulo.

Invalidando la sesión

Una vez que el usuario solicita cerrar sesión, debemos destruir esa sesión. Para hacer esto, necesitamos usar el método invalidate() en la interfaz HttpSession.

anular invalidar():

Java

HttpSession session = request.getSession();
session.invalidate();

Cuando se llama a este método de invalidación en la sesión, elimina todos los objetos que están vinculados a esa sesión.

Ejemplo de inicio y cierre de sesión de Servlet

Crearemos un programa Servlet básico para mostrar un mensaje de bienvenida a los usuarios validados.

Pasos para crear el programa:

  • Cree un «Proyecto web dinámico – Servlet_LoginLogout» en Eclipse.
  • En la carpeta WEB-INF, cree una página JSP: «login.jsp» para obtener las credenciales de inicio de sesión del usuario.
  • En la carpeta src, cree un Servlet: «LoginServlet.java» para procesar la solicitud de inicio de sesión y generar la respuesta.
  • En la carpeta WEB-INF, cree una página JSP: «welcome.jsp» para mostrar el mensaje de bienvenida al usuario.
  • En la carpeta src, cree un Servlet: «LogoutServlet» para procesar la solicitud de cierre de sesión y generar la respuesta.
  • Ejecute el programa usando «Ejecutar como -> Ejecutar en el servidor».

Estructura del proyecto

iniciar sesión.jsp

HTML

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login Page</title>
</head>
<body>
  
    <form action="login" method="post">
  
        <h3>Enter Login details</h3>
  
        <table>
            <tr>
                <td>User Name:</td>
                <td><input type="text" name="usName" /></td>
            </tr>
            <tr>
                <td>User Password:</td>
                <td><input type="password" name="usPass" /></td>
            </tr>
  
        </table>
          
        <input type="submit" value="Login" />
  
    </form>
</body>
</html>
  • En “login.jsp”, tenemos 2 campos, Nombre de usuario y Contraseña.
  • El tipo de entrada del nombre de usuario se especifica como «texto», lo que significa campo de texto.
  • El tipo de entrada del campo de contraseña se especifica como «contraseña» para que cuando el usuario ingrese el campo de contraseña, oculte las letras como puntos.
  • Hemos formado con la acción «iniciar sesión» y el método «publicar» para que cuando se envíe este formulario, se mapee con el LoginServlet que tiene la misma asignación de URL y ejecute el método «doPost» de ese servlet.

LoginServlet.java:

Java

import java.io.IOException;
import java.io.PrintWriter;
  
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
  
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    public LoginServlet() {
        super();
    }
  
    // doPost() method
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  
        // Set the content type of response to "text/html"
        response.setContentType("text/html");
  
        // Get the print writer object to write into the response
        PrintWriter out = response.getWriter();
  
        // Get the session object
        HttpSession session = request.getSession();
  
        // Get User entered details from the request using request parameter.
        String user = request.getParameter("usName");
        String password = request.getParameter("usPass");
  
        // Validate the password - If password is correct, 
        // set the user in this session
        // and redirect to welcome page
        if (password.equals("geek")) {
            session.setAttribute("user", user);
            response.sendRedirect("welcome.jsp?name=" + user);
        }
        // If the password is wrong, display the error message on the login page.
        else {
            RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
            out.println("<font color=red>Password is wrong.</font>");
            rd.include(request, response);
        }
        // Close the print writer object.
        out.close();
    }
}
  • En «LoginServlet.java», estamos usando la anotación «@WebServlet(«/login»)» para asignar la solicitud de URL. También puede especificar esta asignación para el servlet utilizando el Descriptor de implementación: web.xml.
  • Como aprendimos, obtenga el objeto de sesión de HttpSession. Si la solicitud no tiene una sesión, crea una sesión y la devuelve.
  • Aquí, necesitamos obtener los detalles del usuario que se pasan a través de la solicitud, el nombre y la contraseña usando «getParameter()» en el objeto de la solicitud.
  • Para simplificar, solo estamos validando el campo de contraseña. Por lo tanto, el nombre de usuario puede ser cualquier cosa, pero la contraseña debe ser «geek».
  • Valide la contraseña y, si es correcta, establezca el valor de este atributo en la sesión y redirija la página para mostrar el mensaje de bienvenida.
  • Si la contraseña ingresada es incorrecta, muestre un mensaje de error al usuario en la pantalla de inicio de sesión utilizando el objeto Print Writer.

bienvenido.jsp:

HTML

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Welcome Page</title>
</head>
<body>
  
    <form action="logout" method="get">
  
        <h2>
            Hello
            <%=request.getParameter("name")%>!
        </h2>
        <h3>Welcome to GeeksforGeeks..</h3>
  
        <br> <input type="submit" value="Logout" />
    </form>
      
</body>
</html>
  • En la página de bienvenida, muestre el nombre de usuario y un mensaje de bienvenida.
  • Tenemos un formulario con la acción «cerrar sesión» y el método «obtener», de modo que cuando se envía este formulario, se asigna al LogotServlet que tiene la misma asignación de URL y ejecuta el método «doGet» de ese servlet.

Cerrar sesiónServlet.java:

Java

import java.io.IOException;
import java.io.PrintWriter;
  
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    public LogoutServlet() {
        super();
    }
  
    // doGet() method
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  
        // Get the print writer object to write into the response
        PrintWriter out = response.getWriter();
  
        // Set the content type of response to "text/html"
        response.setContentType("text/html");
  
        // For understanding purpose, print the session object in the console before
        // invalidating the session.
        System.out.println("Session before invalidate: "+ request.getSession(false));
  
        // Invalidate the session.
        request.getSession(false).invalidate();
  
        // Print the session object in the console after invalidating the session.
        System.out.println("Session after invalidate: "+ request.getSession(false));
  
        // Print success message to the user and close the print writer object.
        out.println("Thank you! You are successfully logged out.");
        out.close();
    }
  
}
  • Aquí también, estamos usando la anotación “@WebServlet(“/logout”)” para mapear la solicitud de URL.
  • Cuando el usuario hace clic en Cerrar sesión, debemos destruir esa sesión. Por lo tanto, llame al método «invalidar()» en ese objeto de sesión.
  • Para que lo entendamos, podemos imprimir el valor del objeto de la sesión en la consola para ver si la sesión está invalidada.
  • Como aprendimos, «getSession(false)» devuelve la sesión actual a pedido si existe, si no, devuelve nulo. Entonces, después de invalidar la sesión, debería imprimir nulo en la consola.
  • Finalmente, imprima el mensaje de éxito para el usuario.

Producción:

  • Ejecute el programa en el servidor.
  • URL: http://localhost:8081/Servlet_LoginLogout/login.jsp

Página de inicio de sesión

  • El navegador muestra la página de inicio de sesión.

Iniciar sesión con los detalles del usuario

  • Introduzca el nombre de usuario y la contraseña y haga clic en Iniciar sesión.
  • Proporcione la contraseña como «geek» ya que estamos validando contra ella, si no arroja un error como el siguiente.

Contraseña incorrecta

  • Ingrese las credenciales correctas e inicie sesión.

Pagina de bienvenida

  • El nombre de usuario que configuramos en el objeto de sesión se muestra con un mensaje de bienvenida.
  • Haga clic en Cerrar sesión.

Logout_success

  • Ahora, si revisa la consola, imprime los valores del objeto de la sesión.

Consola

  • Como puede ver, «getSession()» devolvió el objeto de sesión existente.
  • Después del método de invalidación, como no hay sesión, devolvió «nulo».

Métodos alternativos para cerrar la sesión del usuario

1) En el ejemplo anterior, hemos utilizado el método «invalidar()», también puede utilizar el método «removeAttribute(String name)» en la interfaz HttpSession.

Java

HttpSession session = request.getSession();
session.removeAttribute("user");

Este método elimina el objeto vinculado con el nombre especificado, en este ejemplo, «usuario» de esta sesión. Si la sesión no tiene un objeto vinculado con el nombre especificado, no hace nada. Entonces, en lugar del método «invalidar()», puede usar «removeAttribute (String)» para cerrar la sesión del usuario.

2) En el ejemplo anterior, invalidamos la sesión manualmente. Si lo desea, también puede especificar el tiempo de espera de la sesión automáticamente después de estar inactivo durante un período de tiempo definido.

«void setMaxInactiveInterval (intervalo int)»:

Java

HttpSession session = request.getSession();
session.setMaxInactiveInterval(100);

Este método especifica el tiempo, en segundos, entre las requests de los clientes antes de que el contenedor de servlets invalide esta sesión. Aquí, como especificamos el valor «100», la sesión se invalidará después de 100 segundos de tiempo inactivo por parte del usuario. El contenedor de servlet destruirá la sesión después de 100 segundos de inactividad: tiempo de espera de la sesión.

Conclusión

De esta forma, puede mantener una sesión para un usuario/cliente específico y puede implementar el inicio y cierre de sesión para aplicaciones que utilizan métodos de interfaz HttpSession según los requisitos.

Publicación traducida automáticamente

Artículo escrito por yaminitalisetty 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 *