Veran uds, tengo una aplicacion web que he estado desarrollando (JAVA-POSTGRESQL), misma que solo pueden acceder usuarios registrados ya que al ingresar solo muestra un panel de LOG IN. En la BD tengo una tabla que registra la sesión iniciada y también registra cuando cierran sesión (es uno de los requerimientos y es imprescindible).
Todo bien hasta ahi, pero el primer problema surge cuando la session expira tras 15 minutos de inactividad (así lo he programado en el fichero "web.xml" y es necesario)
El segundo problema que tengo es cuando el usuario no cierra la sesion al hacer click sobre el boton que tiene destinado para esa funcion y a causa de esto no se registra en la auditoria.
Para comprender mi problema acontinuacion explico como manejo el inicio y cierre de session.
Mi aplicacion la he programado en MVC asi que solo explicaré los JSP que intervienen en login mas no las clases de acceso a datos etc.
los ficheros: login.jsp - validarlogin.jsp - logout.jsp
- login.jsp:
muestra un formulario para ingresar usuario y password el cual envía los datos a "".
Código:
- ValidarLogin.jsp: //- //Es un simple formulario con dos input text //y un submit con el action del mismo hacia el fichero validarlogin.jsp //por eso no crei necesario poner el codigo html //-
el cual copara los datos ingresados con los consultados en base de datos y de acuerdo a esto concede la sesión o no (uso el httpsession ) y es ahí donde también realizo la inserción a la tabla "auditoria" con los datos necesarios de ser concedido el acceso.
Código:
- Logout.jsp: <% //recibo los valores desde el login user = request.getParameter("txtUser"); pass = request.getParameter("txtPass"); if (user != null & pass != null) { //proceso: uso un metodo que consulta la DB y devuelve el ID int id = usuarioDAO.Loguearse(user, pass); if (id > 0) {//si devuelve un ID mayor a cero continua rsUsuario = usuarioDAO.ubicarUsuario(id); //obtengo el resto de datos del usuario con otro metodo //guardo los datos en session con "httpsession " } else { //de lo contrario me envia nuevamente a login.jsp } } %>
contiene un código simple que invalida la sesión cuando se accede directamente a el por medio de un enlace disponible en la pagina principal mostrada después de haberse autentificado correctamente.
Código:
Eso es lo que no he podido controlar en ambos casos ya bien sea cuando la session expira o cuando no acceden al enlace de logout por cerrar el navegador. que dicho sea de paso cuando cierran el navegador tambien la session se invalida sola pero el registrar en la auditoria el cierre escapa de mis manos. <% //INVALIDAR SESSION UsuarioDAO usuarioDAO = new UsuarioDAO();//creo mi objeto //verifico que la session no sea nula if (session.getAttribute("s_usua_login") != null) { //almaceno el id del usuario logueado en idUser int idUser = (Integer) session.getAttribute("s_idUsuario"); //es aqui donde uso el metodo que inserta en //auditoria el cierre de session usuarioDAO.Logout(idUser); //y finalmente invalido la session session.invalidate(); response.sendRedirect("index.jsp"); } else { response.sendRedirect("logout.jsp"); } %>
Espero haber sido claro al explicar mi problema para que alguien pueda darme una idea de como controlar esos dos casos ya bien sea con codigo java, javascript, etc.
Por si las dudas, aclaro que no estoy usando ningun framework.
Sea cual sea la solución o propuesta bienvenida sea, muchas gracias.