2010-02-23 20 views
11

¿Cómo puedo manejar la caducidad de la sesión en una aplicación MVC que tiene llamadas al método JQuery Ajax en ciertas páginas. La cuestión es la siguiente:MVC con JQuery: manejo de la sesión vencer

  • Cuando el cliente llega al tiempo de espera de la sesión, cada uno de mis controladores hereda una clase que comprueba si la sesión está vivo (mirando hacia arriba sobre algunas cosas como la sesión de sitio, sesión de base de datos, etc.) y redirecciona al cliente a una nueva página diciendo que la sesión expira; pero el caso es diferente cuando uso JQuery ajax para llamar a los métodos de los controladores sobre algunos clics de botones, porque omite la validación de la clase heredada y me permite permanecer en la página, pero cuando el controlador intenta finalizar la ejecución del método, obviamente arroja errores .Net: los objetos no se crean como instancia de objetos, variables de sesión no encontradas, etc. todo debido a la sesión caducada que no se manejó debido a la llamada al método asincrónico.

¿Cómo podría manejar este comportamiento, y cuál es la mejor manera de manejarlo (intentando tanto como sea posible no modificar tantas partes del código de la aplicación)?

Gracias de antemano.

PD: Podría ser útil decir que estoy usando $.post() de Jquery.

Respuesta

15

Esto suele ser un error irrecuperable que, por lo general, es mejor que se muestre como una página de error independiente. Configurar la aplicación web para mostrar una página de error personalizada 4nn/5nn y configuración jQuery de la siguiente manera:

$(document).ready(function() { 
    $.ajaxSetup({ 
     error: handleXhrError 
    }); 
}); 

function handleXhrError(xhr) { 
    document.open(); 
    document.write(xhr.responseText); 
    document.close(); 
} 

De esta manera la página 4nn/5nn de error del lado del servidor se mostrará como si ha sido causado por una petición síncrona. He publicado un simliar topic sobre el tema antes.

Otra forma es posponer el tiempo de espera de la sesión ajaxically. Use setInterval() para iniciar una solicitud de encuesta al servidor (que a su vez básicamente toma la sesión de la solicitud) cada vez de la sesión-expiración-menos-diez segundos más o menos.

setInterval(function() { $.get('poll'); }, intervalInMillis); 

Pero la advertencia es que la sesión va a sobrevivir el tiempo que el cliente tiene su ventana del navegador abierta, lo que a veces puede tomar demasiado larga. Si es necesario, puede combinar esto con un tipo de inspector de actividad para que se reduzca al mínimo la posibilidad de que la sesión expire. Aún necesita combinar esto con un controlador de errores decente 4nn/5nn.

$(document).ready(function() { 
    $.active = false; 
    $('body').bind('click keypress', function() { $.active = true; }); 
    checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute. 
}); 

function checkActivity(timeout, interval, elapsed) { 
    if ($.active) { 
     elapsed = 0; 
     $.active = false; 
     $.get('poll'); // Let server code basically do a "get session from request". 
    } 
    if (elapsed < timeout) { 
     elapsed += interval; 
     setTimeout(function() { 
      checkActivity(timeout, interval, elapsed); 
     }, interval); 
    } else { 
     alert($.messages.timeout); // "You will be logged out" blah blah. 
     window.location = 'http://example.com/logout'; 
    } 
} 
+0

Muchas gracias por su respuesta. – lidermin

Cuestiones relacionadas