Esta publicación es la continuación de la parte 2 la cual puedes encontrarla aquí: https://algoritmosyalgomas.com/login-java-web-usuario-password-conexion-base-datos-mysql-n-capas-parte2/
Configuración de Eclipse para ver la aplicación en el navegador
Hasta el momento, la aplicación se nos está mostrando dentro de la interfaz del IDE Eclipse. Sin embargo, no es muy cómodo probar la aplicación de esta manera, por lo que para trabajar con mayor comodidad vamos a configurar Eclipse para que de ahora en adelante la aplicación se nos muestre en un navegador externo: Chrome, Firefox, Opera, etc. En mi caso elegiré Chrome. Para ello hacemos clic en el menú Windows > Web Browser > Chrome

Para ver que la configuración se aplicó correctamente vamos a volver a ejecutar la aplicación web: Hacemos clic derecho en el archivo index.jsp > Run As > Run on Server. A partir de ahora se nos abrirá el navegador seleccionado (Chrome)

Si nos fijamos en la url del navegador, tenemos lo siguiente:
http://localhost:8080/JavaWeb/index.jsp
Allí podemos observar que luego de localhost aparece el número 8080. Este es el puerto donde se está ejecutando el contenedor de servlets Tomcat. Este número de puerto se puede cambiar dependiendo del caso (en algunas situaciones va a ser necesario cambiar el número de puerto debido a conflictos con otros servicios o procesos que ya se estén ejecutando bajo el mismo puerto).
Ahora, ¿qué pasaría si en la url pegamos la siguiente dirección: http://localhost:8080/JavaWeb/principal.jsp ?
Lo que sucede es que se nos muestra la página que contiene el mensaje de Bienvenido salteándonos así el login del principio.

En una aplicación “real” esto no debería suceder. A los visitantes de la aplicación solamente se les debería ser permitido visualizar a página principal.jsp (o cualquier otra página interna de la aplicación) luego de haber iniciado sesión con un usuario y clave en la página del login. Debería existir un mecanismo que nos permita decirle a la aplicación web que tenemos permisos para poder visualizar la página principal.jsp (o cualquier otra página interna del sitio web). Este tipo de mecanismo existe y se denomina Sesión web.
Sesiones web en Java
La sesión web es un mecanismo que permite identificar a un usuario que se encuentra interactuando con un sitio web.
Para implementar sesiones web en java se utiliza un objeto sesión. El objeto sesión debe ser creado al momento que el usuario termina el proceso de inicio de sesión (cuando se logea), y se debe destruir al instante en que el usuario se cierra la sesión (cuando se deslogea) del sitio web.
Vamos a poner en práctica el uso de sesiones en nuestra aplicación web para hacerla más segura y cercana a una aplicación web real. Para ello procederemos a modificar algunos archivos del código fuente:
index.jsp
En este archivo hemos añadido un nuevo elemento html en la línea 11. Se trata del elemento html input con los siguientes atributos:
- name=”tipo”
- value=”iniciarSesion”
El texto “iniciarSesion”, el cual es el valor asignado al input hidden, será enviado al servlet Usuario de manera oculta al momento de realizar el logeo y será útil para que desde el servlet podamos identificar de forma más precisa el tipo de operación que se está realizando, en este caso, un inicio de sesión.
En varias situaciones los inputs hidden son muy útiles para mandar valores al servidor y para que desde este, mediante algún servlet, pueda realizar diversas operaciones, validaciones, etc.
ServletUsuario.java
También vamos a modificar el servlet ServletUsuario para que reciba el parámetro adicional llamado “tipo” (el que fue enviado desde la página index.jsp) con el cual podremos identificar el tipo de acción u operación que queremos realizar.
Para esta ocasión, vamos a definir en el servlet dos posibles acciones:
- Procesar el login o inicio de sesión, el cual ya habíamos implementado en las entradas anteriores, pero esta vez vamos a añadir la creación del objeto sesión dentro del método iniciarSesión.
- Procesar el logout o cierre de sesión. Esto lo haremos dentro del método cerrarSesion.
En la línea 21 se recupera el valor del parámetro tipo que llega al Servlet junto con la petición dentro del objeto request. En la línea 23 se evalúa el valor recibido y en base a eso se invoca al método iniciarSesion o cerrarSesion en las líneas 24 y 26 respectivamente.
Procesamiento del inicio de sesión: En la línea 41 se declara una variable de tipo HttpSession llamada sesion. A esta se le asigna el resultado de la llamada al método getSession en el objeto request (HttpServletRequest).
El funcionamiento del método getSession es el siguiente: retorna la sesión actual si existe; en caso contrario, crea una nueva. Para nuestro caso, debido a que en ningún momento hemos creado una sesión, se creará una nueva.
En la línea 42 se está seteando dentro del objeto session mediante el método setAttribute, el objeto usuario con la información del usuario que se está logeando. El nombre asignado al atributo es “usuario”, y será con este nombre que lo vamos a leer/recuperar desde el jsp correspondiente como se explica más adelante.
Algo importante que se debe aclarar es que todos los servlets y jsps accesados por un mismo cliente (navegador) compartirán la misma sesión (el mismo objeto sesión).
Procesamiento del cierre de sesión: En la línea 48 se obtendrá una referencia a la sesión para después invalidarla o destruirla en la línea 49 con el método invalidate. En la línea 50 seteamos un atributo “mensaje” con el mensaje “Iniciar sesión”. En la línea 51 hacemos una redirección de la petición hacia el archivo index.jsp y reenviamos los objetos request y response. El mensaje seteado en la línea 50 lo vamos a recuperar en el archivo index.jsp luego de ejecutarse la redirección.
validar.jsp
Vamos a crear una nueva página JSP llamada validar.jsp dentro de la carpeta WebContent (recuerda que si no tienes la carpeta WebContent, en su lugar tendrás la carpeta webapp dentro de src/main/webapp.), la cual tendrá como objetivo evitar que la página principal.jsp sea visible cuando no haya existido un proceso previo de logeo, es decir, no exista un objeto usuario seteado en la sesión actual (en un objeto sesión).
Para esto, en la línea 2 procedemos a hacer referencia a un objeto session el cual, ya existe en cualquier JSP por lo cual se puede hacer referencia a este sin problemas (es un objeto implícito). Con el método getAttribute y el nombre “usuario” se intenta traer, en caso exista, el objeto usuario. En caso de que no exista, el método traerá null con lo cual podemos concluir que el usuario actual no se logeado en el sitio web, por lo cual se redireccionará hacia la página index.jsp para que realice su logeo respectivo.
encabezado.jsp
Este jsp nos permitirá crear una página reutilizable dentro de otras. Es útil para incluir barras de navegación, links, etc que normalmente se repiten en todas las páginas de una aplicación web.
Para empezar, únicamente vamos a incluir dentro de esta página un link que permita cerrar la sesión.
Veamos que en la línea 10, en el atributo href del link tenemos como valor: “usuario?cerrarSesion”. Aquí podemos identificar dos cosas:
- usuario: es el nombre del Servlet a invocar luego de hacer clic en el link.
- tipo=cerrarSesion: vendría a ser el nombre de un parámetro: “tipo” y su valor “cerrarSesion”. Este parámetro es enviado al servlet “usuario” para que éste sepa el tipo de operación a realizar.
principal.jsp
La página principal.jsp como ya habíamos visto es la primera página a la que nos redirecciona el sistema una vez que nos hayamos logeado.
En la primera línea de esta página estamos usando la etiqueta jsp de inclusión dinámica jsp:include para incluir el contenido de la página validar.jsp con el objetivo de que primero se ejecute toda su lógica, el cual consiste en validar de que exista un objeto usuario en la sesión.
Si tuviéramos más páginas internas en nuestra aplicación, es decir, páginas que solo deben ser visibles para usuarios logeados, entonces deberíamos reusar e incluir la página validar.jsp de la misma manera como lo estamos haciendo ahora.
Además de incluir la página validar.jsp también incluimos en la línea 11 el contenido de la página encabezado.jsp para reutilizar su contenido.
Por último, en la línea 12 estamos mostrando el nombre del usuario que se está logeando. Este nombre lo obtenemos del objeto usuario que está almacenado en el objeto sesión. Podríamos haberlo hecho con scriptlets pero en esta ocasión estamos usando el lenguaje de expresiones EL: ${sessionScope.usuario.nombre}
Prueba de la aplicación web
Para probar la aplicación volvemos a hacer clic derecho sobre la aplicación JavaWeb y elegimos Run As / Run on server

Vamos a intentar ingresar directamente a la página principal.jsp sin logearnos previamente:
http://localhost:8081/JavaWeb/principal.jsp
Podrás notar que que inmediatamente el sitio web te redireccionará hacia el login y te mostrará el mensaje de error que habíamos definido en la página validar.jsp. Este es debido a que no existe ninguna sesión en memoria ya que no nos hemos logeado.

Ahora procedemos a iniciar sesión con el usuario “jose” y password “123”

Podrás ver que ahora sí el sistema te muestra la página principal.jsp.
Internamente lo que ha ocurrido es lo siguiente:
- El servlet que procesa la petición de login crea un objeto sesión donde guarda el objeto usuario con su información e inmeditamente redirecciona hacia la página principal.jsp.
- Dentro de la página principal.jsp: primero carga el contenido de la página validar.jsp que como ya sabemos, valida que exista el objeto usuario dentro de la sesión (en caso negativo nos redireccionaría hacia el login). Luego carga el resto del contenido de la página.

Para cerrar sesión solo damos clic al link “Cerrar sesión” de la página, con la cual haremos una petición hacia el Servlet el cual ejecutará el método correspondiente encargado de destruir la sesión y volveremos a ser redirigidos hacia la página de login.


A partir de ahora, ya no podremos ingresar a la página principal.jsp a menos que nos hayamos logeado.
Si te fue de ayuda esta entrada, déjame en los comentarios para seguir subiendo contenido así.
Próximamente vamos a terminar el aplicativo de login añadiendo hojas de estilos, lógica de validación con javascript y utilizando etiquetas de la librería JSTL para aplicar validaciones en la página jsp del login.
La continuación está aquí: https://algoritmosyalgomas.com/login-java-web-usuario-password-conexion-base-datos-mysql-n-capas-parte4/
La lista completa de entradas relacionadas a esta son las siguientes:
Parte 1: Login en Java web y MySQL – N capas (JSP’s y Servlets) Parte 1 – 4
Parte 2: Login en Java web y MySQL – N capas (JSP’s y Servlets) Parte 2 – 4
Parte 3: Login en Java web y MySQL – N capas (JSP’s y Servlets) Parte 3 – 4
Parte 4: Login en Java web y MySQL – N capas (JSP’s y Servlets) Parte 4 – 4