Control de tiempo inactividad de usuario JPS Javascript

Compañeros de foro. Acudo con un problema que no se como resolver a ver si me pueden ayudar.

Para una aplicación empresarial, se requiere que por medidas de seguridad se cierre la aplicación tras cierto tiempo de inactividad, específicamente a los 3 minutos. Sin embargo, un minuto antes de que expire la sesión, se le notifique al usuario mediante un mensaje de advertencia, de manera que el reanude la actividad o que termine la sesión, según su preferencia.

La aplicación esta basada en JEE con servlets y jsp, y en el jsp principal uso un JavaScript para simular un contador de tiempo donde al faltar un minuto se levanta un JavaScript Confirm. Si el usuario presiona el botón "Aceptar" del Confirm, en teoría se debe extender el tiempo de sesión (incluso cuando no haga ninguna actividad que implique peticiones al servidor) y si presiona cancelar, invalida la sesión y cierra la aplicación.

El script no funciona correctamente porque el timer cuenta dos minutos a partir de que se carga la pagina, y no logro sincronizar el tiempo del timer con el del ultimo acceso a la sesión, de manera de levantar el mensaje de Confirm de acuerdo a la ultima vez que el usuario realizo una operación que implicase una llamada al servidor, que seria lo correcto.

Por otra parte no encuentro la forma de hacer que la sesión del lado del servidor se mantenga viva, ya que en el web.xml se tiene configurado el máximo tiempo de inactividad permitido.

He probado varias cosas pero no me han funcionado. Supongo que por desconocimiento sobre el funcionamiento de la arquitectura.

Una de las opciones que leí en Internet era enviar una petición al servidor desde un Script con Jquery y Ajax. Esto para mantener la sesión viva del lado del servidor, pero creo que no tengo claro como usar Ajax porque no logro que haga nada. No se si esos son todos script src que debo usar o si hace falta algo más. Acá el código:

<script language="javascript">
var timeoutId = window.setInterval("confirmarSesion()",<%= ((request.getSession().getMaxInactiveInterval())-60)*1000 %>);

function confirmarSesion()
{
        var maxTimeWait = 60 * 1000;
        var d = new Date();
       
        <%
                HttpSession nsession = request.getSession(false);                      
       
                if(nsession == null)
                {
                %>
                        alert("Su sesión ha expirado por inactividad.");
                        parent.window.location.href="<%= request.getContextPath()%>/login.jsp";
                <%
                }
                else
                {
                %>
                        if (confirm("Su sesión va expirar por inactividad - Presione el botón 'Aceptar' para extender la sesión, de lo contrario en los próximos sesenta (60) segundos se cerrará la aplicación."))
                        {
                                var timeDiff = (new Date() - d);
                                if(timeDiff > maxTimeWait)
                                {
                                alert("Su sesión ha expirado.");
                                        parent.window.location.href="<%= request.getContextPath()%>/login.jsp";        
                            }  
                                else
                                {                                              
                                        keepSessionAlive();
                                        window.clearInterval(timeoutId);       
                                        window.setInterval("confirmarSesion()",<%= ((request.getSession().getMaxInactiveInterval())-60)*1000 %>);                                                      
                                }              
                        }
                        else
                        {              
                                parent.window.location.href='…/MiServlet';
                        }
                <%
            }
            %>
}
</script>

<script src="…/jquery-1.4.2.js" type="text/javascript">
        function keepSessionAlive()
        {
        $.post("keepAliveSession.html");
        alert("keepSessionAlive");
        }
</script>

Leyendo el mensaje del Confirm me doy cuenta de que tampoco logro cerrar la aplicación si el usuario no presiona el botón aceptar, lo cual es uno de los comportamientos que desean para la aplicación.

Y pues lo de sincronizar los tiempos del timer y del ultimo acceso a la sesión pues...no tengo ni idea de como hacerlo.

Agradezco si alguien ve cual es la falla o tiene alguna otra idea que me puedan ayudar para implementar lo que necesito, lo apreciaría mucho.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

en el server

En el server puedes ponerle tiempo de vida a la sesión (no recuerdo exactamente cómo era pero tienes que obtener el objeto de sesión y ponerle algún timeout).

Muchas gracias por

Muchas gracias por responder.

Si, el tiempo de inactividad se establece en un archivo que esta en el servidor (web.xml) el cual puedo acceder desde el JSP a través de request.getSession().getMaxInactiveInterval(). Esto me funciona correctamente, la session expira en el tiempo que he fijado acá.

Supongo que para el servidor, la inactividad se mide por la ausencia de peticiones hacia él mismo. Lo que no sé es como hacer para realizar una petición al servidor para que mantenga la sesión viva al momento de que el usuario me indique que desea extender el tiempo de sesión a través del confirm message que estoy levantando a través de JavaScript sin necesidad de refrescar la pagina.

Imagen de ezamudio

ajax, timer

un timer que envíe una pequeña petición ajax.

Ejemplo

Quizás este ejemplo pueda ser de utilidad.

Voy a revisar y probar y te

Voy a revisar y probar y te aviso.

Igual gracias de antemano!

Si, eso me están sugiriendo.

Si, eso me están sugiriendo. Igual yo implementé uno pero no cumple con todo lo que necesito. Voy a revisar el código que me sugiere el amigo jpaul a ver si lo puedo adaptar. Gracias!

Imagen de arterzatij

Utiliza este plugin yo lo

Utiliza este plugin yo lo hice con esto y como dice el buen Zamudio envia una peticion ajax.

https://github.com/kidh0/jquery.idle

El tiempo del idle lo puedes establecer con el que indicas desde el web.xml