Sesiones en Servlets y JSP. Ejemplo de login y logout
Anuncio:
Vamos a ver cómo manejar sesiones en Java con servlets y jsp’s, idóneo para hacer inicio de sesión en una aplicación web.
Bien, suponemos que ya tenemos creado nuestro proyecto web, vamos a crear un archivo jsp e introduciremos un formulario:
<form action="login" method="POST">
<input type="text" name="user" value="usuario" />
<input type="password" name="password" value="contraseña" />
<input type="submit" value="Enviar" />
</form>
Al pulsar en el botón «Enviar», el navegador redigirá al servlet «login», encargado de validar los datos:
public class login extends HttpServlet {
...
//metodo encargado de la gestión del método POST
protected void processRequestPOST(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession sesion = request.getSession();
String usu, pass;
usu = request.getParameter("user");
pass = request.getParameter("password");
//deberíamos buscar el usuario en la base de datos, pero dado que se escapa de este tema, ponemos un ejemplo en el mismo código
if(usu.equals("admin") && pass.equals("admin") && sesion.getAttribute("usuario") == null){
//si coincide usuario y password y además no hay sesión iniciada
sesion.setAttribute("usuario", usu);
//redirijo a página con información de login exitoso
response.sendRedirect("loginExito.jsp");
}else{
//lógica para login inválido
}
}
//método encargado de la gestión del método GET
protected void processRequestGET(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//me llega la url "proyecto/login/out"
String action=(request.getPathInfo()!=null?request.getPathInfo():"");
HttpSession sesion = request.getSession();
if(action.equals("/out")){
sesion.invalidate();
response.sendRedirect("/home.jsp");
}else{
}
}
...
}
Una vez logueados correctamente, vamos a la página «loginExito.jsp», en esta, podemos mostrar el siguiente mensaje:
Bienvenido ${sessionScope.usuario}
Con esto último, accedo mediante EL (Expression Language) al contexto de sesión y extraigo el nombre de usuario.
Para «desloguear» vamos al método processRequestGET, donde tenemos la lógica encargada para ello, si vamos a la url «rutaProyecto/login/out» entraremos dentro del condicional y se invalidará nuestra sesión (logout).
Como apunte, si en algún lugar de nuestra aplicación necesitamos tener a un usuario logueado, ya sea en un panel de administración, por ejemplo, nuestra primera tarea será comprobar si hay una sesión iniciada, por ejemplo:
if(sesion.getAttribute("usuario") == null){
//redirijo al login
}
Espero que os haya sido de ayuda.
HackSaludos!
32 comentarios
El ejemplo es basico pero suficiente. Vale el aporte.
Pero sugiero, pensando en aquellos que recien empiezan, colocar el codigo completo con diagramas de navegación que clarifique tu solución. Saludos
Gracias Juan, lo tendremos en cuenta!
Hola buenas, si abro dos pestañas con distinto usuario sabrías decirme por que me saca el mismo id de sesión y se mezclan la sesiones?
Un saludo.
Es por la forma en que el navegador trata las sesiones. Si abres una pestaña en modo incognito, o abres otro navegador, verás que podrás iniciar otra sesión.
Hola, muchas gracias por el aporte, de verdad es de mucha utilidad y de ayuda invaluable.
Tengo un problema al colocar en el navegador la url “http://localhost:8084/TestSession/login/out”
Men manda error:
Estado HTTP 404 – /TestSession/login/out
type Informe de estado
mensaje /TestSession/login/out
descripción El recurso requerido no está disponible.
Apache Tomcat/8.0.27
Hola Emilio!
Tu Tomcat está corriendo en el puerto 8084 o en el 8080?
Saludos!
Cambie un parámetro ya que el getPathInfo siempre me lo daba en null, lo cambie a /out
String action=(request.getPathInfo()!=null?request.getPathInfo():»/out»);
Aun así si escribo la liga “http://localhost:8084/TestSession/login/out”
Me sigue dando el mismo error, pero si solo envío:
“http://localhost:8084/TestSession/login
Ya funciona sin problema
Con «Ya funciona sin problema» te refieres a que ya te funciona todo?
Si no, a ver si puedes compartirnos el código en github, pastebin… etc.
Cualquier cosa nos comentas.
Saludos!
Está corriendo en el puerto 8084.
Hola, podrias explicarme lo que se hace en el get, me he perdido, gracias
Hola Jhony, en el get se está comprobando si hay una sesión iniciada, la presencia del atributo «usuario», y su valor distinto de null, indican que hay una sesión activa.
Saludos!
Hola, muy buena info, es de mucha ayuda. Pero tengo un problema con el cerrar sesión. Cree un servlet y para cerrar la sesión de usuario lo redirecciono ahí, pero la sesión permanece abierta. 🙁
Saludos!
Hola! ¿Estás llamando a la función ‘invalidate’ de la sesión?
Saludos!