Ya no necesitas investigar más por todo internet porque has llegado al lugar correcto, poseemos la solución que buscas y sin complicaciones.
Solución:
No hay una manera exacta de hacer esto con el lado del cliente. No hay ningún evento que se active cuando se sale de la página. Debe hacerse con el evento de fin de sesión en el servidor.
Puede intentar usar onbeforeunload o unload, pero las condiciones de carrera evitarán que eso suceda. Y no se activan cuando los navegadores fallan, se pierde la conexión a Internet, etc.
Traté este problema recientemente en mi aplicación angularJS: el problema principal era que no quiero cerrar la sesión si actualiza, pero sí quiero si cierra la pestaña. Las solicitudes de Ajax con onbeforeunload/onunload no son garantizado esperar respuesta, así que aquí está mi solución:
Configuré una cookie de almacenamiento de sesión al iniciar sesión que es solo un bool – ajustado a true cuando recibo respuesta de inicio de sesión
sessionStorage.setItem('activeSession', 'true');
Obviamente, al cerrar la sesión, establecemos esta bandera en false
Ya sea cuando el controlador se inicializa o usando window.onload (en mi archivo app.js), compruebo esta sesión activa bool.. si esto es falsetengo esta pequeña instrucción if: si se cumplen las condiciones, llamo a mi método de cierre de sesión DESCARGAR en lugar de descargar
var activeSession = sessionStorage.activeSession;
if (sessionStorage.loggedOutOnAuth)
console.log('Logged out due to expiry already')
else if (!activeSession)
sessionStorage.loggedOutOnAuth = true;
_logout()
Básicamente, el “loggedOutAuth” bool avíseme que acabo de vencerlo en la carga de la página debido a la ausencia de una sesión activa en sessionStorage para que no se quede atascado en un bucle
Esta fue una gran solución para mí ya que no quería implementar un latido/websocket
Agregue su código de cierre de sesión al evento on onunload.
window.onunload = function ()
//logout code here...
En JQuery puedes usar la función .unload(). Recuerda que no tienes mucho tiempo por lo que puedes enviar la solicitud de Ajax pero el resultado puede no llegar al cliente.
Otro truco es abrir una pequeña ventana nueva y manejar el cierre de sesión allí.
window.open("logout url","log out","height=10,width=10,location=no,menubar=no,status=no,titlebar=no,toolbar=no",true);
Si desea deshabilitar el cierre de la ventana (o al menos advertir al usuario), puede usar este código:
window.onbeforeunload = function(event)
//if you return anything but null, it will warn the user.
//optionally you can return a string which most browsers show to the user as the warning message.
return true;
Otro truco es seguir haciendo ping al cliente cada pocos segundos. Si no recibe respuesta, suponga que el usuario ha cerrado la ventana, el navegador se ha bloqueado o hay un problema de red que terminó la sesión de chat de todos modos. En el lado del cliente, si no recibe este paquete de ping, puede suponer que la conexión de red o el servidor tiene un problema y puede mostrar la advertencia de cierre de sesión (y, opcionalmente, permitir que el usuario inicie sesión nuevamente).
Valoraciones y comentarios
Recuerda algo, que puedes optar por la opción de valorar esta división si diste con la contestación.