Control de sesión por inactividad JSP JavaScript
Publicado por Jennifer (7 intervenciones) el 13/10/2015 15:49:13
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.
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.
Valora esta pregunta
0