Haz todo lo posible por interpretar el código bien previamente a usarlo a tu trabajo si ttienes algo que aportar puedes dejarlo en los comentarios.
Solución:
Ok, arrojaré mis dos centavos al ring aquí.
Aunque en teoría es posible implementar esto usando rolling session
no creo que debas…
- Requeriría que cada acción del usuario envíe una solicitud al servidor, para que el usuario no cierre la sesión.
- Pierde la oportunidad de informar a su usuario que pronto se cerrará automáticamente (esto es lo que hacen los bancos, por ejemplo).
@Seth señaló en un comentario anterior que en realidad hay una manera de remediar esto: “Si la interfaz está separada del servidor, podría tener un middleware de enrutamiento del lado del cliente que verifica la cookie y visualmente cierra la sesión, demostrando así un buena experiencia de usuario”.
Creo que esto es inteligente, pero también creo que es como ponerle lápiz labial a un cerdo.
Creo que el mejor enfoque aquí es manejar esto del lado del cliente.
Sugeriría algo como esto:
var AutoLogout = (function()
function AutoLogout()
this.events = ['load', 'mousemove', 'mousedown',
'click', 'scroll', 'keypress'];
this.warn = this.warn.bind(this);
this.logout = this.logout.bind(this);
this.resetTimeout = this.resetTimeout.bind(this);
var self = this;
this.events.forEach(function(event)
window.addEventListener(event, self.resetTimeout);
);
this.setTimeout();
var _p = AutoLogout.prototype;
_p.clearTimeout = function()
if(this.warnTimeout)
clearTimeout(this.warnTimeout);
if(this.logoutTimeout)
clearTimeout(this.logoutTimeout);
;
_p.setTimeout = function()
this.warnTimeout = setTimeout(this.warn, 29 * 60 * 1000);
this.logoutTimeout = setTimeout(this.logout, 30 * 60 * 1000);
;
_p.resetTimeout = function()
this.clearTimeout();
this.setTimeout();
;
_p.warn = function()
alert('You will be logged out automatically in 1 minute.');
;
_p.logout = function()
// Send a logout request to the API
console.log('Sending a logout request to the API...');
this.destroy(); // Cleanup
;
_p.destroy = function()
this.clearTimeout();
var self = this;
this.forEach(function(event)
window.removeEventListener(event, self.resetTimeout);
);
;
return AutoLogout;
)();
es2015
class AutoLogout
constructor()
this.events = ['load', 'mousemove', 'mousedown',
'click', 'scroll', 'keypress'];
this.warn = this.warn.bind(this);
this.logout = this.logout.bind(this);
this.resetTimeout = this.resetTimeout.bind(this);
this.events.forEach((event) =>
window.addEventListener(event, this.resetTimeout);
);
this.setTimeout();
clearTimeout()
if(this.warnTimeout)
clearTimeout(this.warnTimeout);
if(this.logoutTimeout)
clearTimeout(this.logoutTimeout);
setTimeout()
this.warnTimeout = setTimeout(this.warn, 29 * 60 * 1000);
this.logoutTimeout = setTimeout(this.logout, 30 * 60 * 1000);
resetTimeout()
this.clearTimeout();
this.setTimeout();
warn()
alert('You will be logged out automatically in 1 minute.');
logout()
// Send a logout request to the API
console.log('Sending a logout request to the API...');
this.destroy(); // Cleanup
destroy()
this.clearTimeout();
this.events.forEach((event) =>
window.removeEventListener(event, this.resetTimeout);
);
Solución de sondeo parcial:
var activityPolling = (function()
var events = ['load', 'mousemove', 'mousedown', 'click', 'scroll', 'keypress'];
var active = true;
var timeout;
function poll()
if(active)
console.log('polling the server...')
function setIdle()
active = false;
function setActive()
active = true;
if(timeout)
clearTimeout(timeout);
timeout = setTimeout(setIdle, 30 * 60 * 1000);
function destroy()
clearInterval(interval);
events.forEach(function(event)
window.removeEventListener(event, setActive);
);
events.forEach(function(event)
window.addEventListener(event, setActive);
);
setActive();
var interval = setInterval(poll, 60 * 1000);
return
interval: interval,
destroy: destroy
)();
La sesión continua puede resolver el propósito.
Si usa la opción “rolling” para la sesión a “true”actualizará el tiempo de espera de la sesión en nuevas solicitudes.
Lo que puede hacer es: establecer la edad máxima en 5 minutos.
maxAge: 30*10000
Cuando no hay actividad, max-age destruirá la sesión. Sin embargo, cuando haya alguna actividad, rodar renovará la sesión para estar activa durante los próximos 30 minutos.
Nuevamente, la palabra inactividad en esta pregunta es un poco engañosa. La inactividad puede ser cualquiera (o todas) sin movimiento del mouse, sin clic del mouse o sin interacción con el servidor.
Si se refiere a la inactividad como sin interacción con el servidor, esta lógica funcionará. Sin embargo, para la inactividad sin interacciones de interfaz de usuario, debe manejar desde el lado del cliente