jueves, 17 de septiembre de 2009

Controlar cuando cierra el usuario el navegador

Controlar cuando el usuario nos cierra el navegador ¿Es posible?
Pues sí, es posible, empleando un pequeño truquillo en la maquetación en nuestro Site.

En el cliente en el que me encuentro actualmente me lo pidieron como requisito indispensable, puesto que intentan asemejar el comportamiento de sus aplicaciones Winform y ademas así liberar todos los objetos asociados a esa sesión. Otro requerimiento es que un usuario sólo pueda abrir un ventana de IExplorer para cada aplicación, pero esto lo veremos en la siguiente entrega.

Como comenté en el primer párrafo todo se basa en el modélo de maquetación del site. Es necesario tener una página que nunca se descargue y que solo se dispare su evento JavaScript OnUnload bien cuando nos cierre el navegador de la dichosa X o cuando pulse nuestro botón de desconexión, por lo tanto vamos a utilizar una página principal que sea contenedora de otras páginas mediante un IFRAME:
<div id="content">
<iframe id="contenido" src="contenido1.aspx" frameBorder="0" width="100%" height="400">
</div>
En el IFRAME se realizará la navegación de nuestro Site y así podremos controlar cuando nos cierra el navegador ¿Pero como? pues sencillo, lo controlaremos con un campo oculto:
<input id="logout" type="hidden" value="0">
al que asignaremos un valor distinto de 0 desde nuestro botón de desconexión desde el Code-Behind:
private void imgBtnSalir_Click(object sender, System.Web.UI.ImageClickEventArgs e) 
{
   FormsAuthentication.SignOut();
   Session.Abandon();
   Page.RegisterStartupScript("logout", "<script>document.getElementById(\"logout\").value=1;</script>");
   Page.RegisterStartupScript("close","<script>window.close();</script>");
}
Y en el evento JavaScript OnUnload comprobamos ese valor con la función Logout (<body OnUnload="Logout();">):
function Logout() 
{
   var logout = document.getElementById("logout");
   if (logout.value == 0)
   {
      openCenterPopUp("logout.aspx", "", 600, 70);
   }
} 

Si es 0, abrimos la ventana logout.aspx que se encarga de liberar los recursos de la sesión y de hacer un logout de la autenticación (Aunque yo esto no lo hago en mi cliente puesto que es una intranet y utilizo la autenticación de Windows integrada pero para el ejemplo he preferido añadirlo):

private void Page_Load(object sender, System.EventArgs e)
{
   FormsAuthentication.SignOut();
   Session.Abandon();
   this.RegisterStartupScript("close", "<script>setTimeout(\"window.close();\",10000);</script>");
}

Fuente: esto lo saqué del blog "Amigo mío Siempre estas Programando en .NET"

No hay comentarios: