asp.net - sesion - Cerrar/matar la sesión cuando se cierra el navegador o la pestaña
cómo evitar que la sesión caduque por inactividad asp net (9)
Como dijiste en la ventana del evento. Antes de descargar los incendios cuando los usuarios hacen clic en un enlace o actualizan la página, entonces ni siquiera sería bueno finalizar una sesión.
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx describe todas las situaciones donde se activa window.onbeforeonload. (ES DECIR)
Sin embargo, puede colocar una variable global de JavaScript en sus páginas para identificar acciones que no deberían desencadenar un cierre de sesión (mediante el uso de una llamada AJAX desde onbeforeonload, por ejemplo).
El siguiente script se basa en JQuery
/*
* autoLogoff.js
*
* Every valid navigation (form submit, click on links) should
* set this variable to true.
*
* If it is left to false the page will try to invalidate the
* session via an AJAX call
*/
var validNavigation = false;
/*
* Invokes the servlet /endSession to invalidate the session.
* No HTML output is returned
*/
function endSession() {
$.get("<whatever url will end your session>");
}
function wireUpEvents() {
/*
* For a list of events that triggers onbeforeunload on IE
* check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
*/
window.onbeforeunload = function() {
if (!validNavigation) {
endSession();
}
}
// Attach the event click for all links in the page
$("a").bind("click", function() {
validNavigation = true;
});
// Attach the event submit for all forms in the page
$("form").bind("submit", function() {
validNavigation = true;
});
}
// Wire up the events as soon as the DOM tree is ready
$(document).ready(function() {
wireUpEvents();
});
Este script puede incluirse en todas las páginas
<script type="text/javascript" src="js/autoLogoff.js"></script>
Repasemos este código:
var validNavigation = false;
window.onbeforeunload = function() {
if (!validNavigation) {
endSession();
}
}
// Attach the event click for all links in the page
$("a").bind("click", function() {
validNavigation = true;
});
// Attach the event submit for all forms in the page
$("form").bind("submit", function() {
validNavigation = true;
});
Una variable global se define a nivel de página. Si esta variable no se establece en verdadero, el evento windows.onbeforeonload terminará la sesión.
Se asocia un controlador de eventos a cada enlace y formulario en la página para establecer esta variable en verdadera, lo que evita que la sesión finalice si el usuario solo está enviando un formulario o haciendo clic en un enlace.
function endSession() {
$.get("<whatever url will end your session>");
}
La sesión finaliza si el usuario cerró el navegador / pestaña o navegó fuera. En este caso, la variable global no se configuró en verdadero y la secuencia de comandos realizará una llamada AJAX a la URL que desee para finalizar la sesión.
Esta solución es independiente de la tecnología del lado del servidor. No fue probado exhaustivamente pero parece funcionar bien en mis pruebas
¿Alguien puede decirme cómo puedo cerrar / matar la sesión cuando el usuario cierra el navegador? Estoy usando el modo stateserver para mi aplicación web asp.net. El método onbeforeunload
no es adecuado ya que se dispara cuando el usuario actualiza la página.
Como se dijo, el navegador no le avisa al servidor cuando se cierra.
Aún así, hay algunas maneras de lograr este comportamiento de cerca. Puede poner un pequeño script AJAX en su lugar que actualice el servidor periódicamente para que el navegador esté abierto. Debe vincular esto con algo que se active en las acciones realizadas por el usuario, de modo que pueda agotar el tiempo de espera de una sesión inactiva, así como una que se haya cerrado.
Lo hago así:
$(window).bind(''unload'', function () {
if(event.clientY < 0) {
alert(''Thank you for using this app.'');
endSession(); // here you can do what you want ...
}
});
window.onbeforeunload = function () {
$(window).unbind(''unload'');
//If a string is returned, you automatically ask the
//user if he wants to logout or not...
//return ''''; //''beforeunload event'';
if (event.clientY < 0) {
alert(''Thank you for using this service.'');
endSession();
}
}
No es perfecto, pero la mejor solución por ahora:
var spcKey = false;
var hover = true;
var contextMenu = false;
function spc(e) {
return ((e.altKey || e.ctrlKey || e.keyCode == 91 || e.keyCode==87) && e.keyCode!=82 && e.keyCode!=116);
}
$(document).hover(function () {
hover = true;
contextMenu = false;
spcKey = false;
}, function () {
hover = false;
}).keydown(function (e) {
if (spc(e) == false) {
hover = true;
spcKey = false;
}
else {
spcKey = true;
}
}).keyup(function (e) {
if (spc(e)) {
spcKey = false;
}
}).contextmenu(function (e) {
contextMenu = true;
}).click(function () {
hover = true;
contextMenu = false;
});
window.addEventListener(''focus'', function () {
spcKey = false;
});
window.addEventListener(''blur'', function () {
hover = false;
});
window.onbeforeunload = function (e) {
if ((hover == false || spcKey == true) && contextMenu==false) {
window.setTimeout(goToLoginPage, 100);
$.ajax({
url: "/Account/Logoff",
type: ''post'',
data: $("#logoutForm").serialize(),
});
return "Oturumunuz kapatıldı.";
}
return;
};
function goToLoginPage() {
hover = true;
spcKey = false;
contextMenu = false;
location.href = "/Account/Login";
}
No es posible eliminar la variable de sesión, cuando la máquina se apaga inesperadamente debido a una falla de energía. Solo es posible cuando el usuario está inactivo por un tiempo prolongado o está cerrando sesión correctamente.
No puedes. HTTP es un protocolo sin estado, por lo que no puede saber cuándo un usuario ha cerrado su navegador o simplemente está sentado allí con una ventana abierta del navegador sin hacer nada.
Es por eso que las sesiones tienen un tiempo de espera: puede intentar reducir el tiempo de espera para cerrar las sesiones inactivas más rápido, pero esto puede hacer que los usuarios legítimos tengan el tiempo de espera de la sesión más temprano.
Para cerrar el navegador, puede poner el código siguiente en su web.config:
<system.web>
<sessionState mode="InProc"></sessionState>
</system.web>
Destruirá tu sesión cuando el navegador esté cerrado, pero no funcionará para cerrar la pestaña.
Por favor refiérase a los siguientes pasos:
- Primero crea una página SessionClear.aspx y escribe el código para borrar la sesión
A continuación, agregue el siguiente código JavaScript en su página o página maestra:
<script language="javascript" type="text/javascript"> var isClose = false; //this code will handle the F5 or Ctrl+F5 key //need to handle more cases like ctrl+R whose codes are not listed here document.onkeydown = checkKeycode function checkKeycode(e) { var keycode; if (window.event) keycode = window.event.keyCode; else if (e) keycode = e.which; if(keycode == 116) { isClose = true; } } function somefunction() { isClose = true; } //<![CDATA[ function bodyUnload() { if(!isClose) { var request = GetRequest(); request.open("GET", "SessionClear.aspx", true); request.send(); } } function GetRequest() { var request = null; if (window.XMLHttpRequest) { //incase of IE7,FF, Opera and Safari browser request = new XMLHttpRequest(); } else { //for old browser like IE 6.x and IE 5.x request = new ActiveXObject(''MSXML2.XMLHTTP.3.0''); } return request; } //]]> </script>
Agregue el siguiente código en la etiqueta de cuerpo de la página maestra.
<body onbeforeunload="bodyUnload();" onmousedown="somefunction()">
Utilizar esta:
window.onbeforeunload = function () {
if (!validNavigation) {
endSession();
}
}
Evite F5, envíe formularios, haga clic en la entrada y cierre / cierre la sesión cuando el navegador o la pestaña estén cerrados, probados en ie8 + y los navegadores modernos, ¡disfrute!