2009-08-12 17 views
10

Estoy usando jQuery y el complemento jQuery.form para enviar mi formulario (también usando ASP.Net MVC).jQuery AJAX ver redirigir como estado 200 no 302?

Problema es que el usuario se encuentra en una sección del sitio que utiliza autenticación de formularios y si su cookie de autenticación caduca durante su tiempo en la página en lugar de recuperar un estado de 302, que sería el redireccionamiento a la página de inicio de sesión. Todavía tengo 200?

En FireBug veo el 302 Encontrado y luego mi página de inicio de sesión se sirve a continuación como un 200 que es el código de estado enviado de regreso a mi llamada Ajax. ¿Cómo puedo detectar que han cerrado la sesión si nunca veo el 302 enviado de vuelta al complemento jQuery?

+0

¿Ha intentado comprobar la cookie de autenticación? Parece que sería más fácil comprobar la cookie para detectar si el usuario está conectado. – user120242

Respuesta

0

tratan con caché: falsa cache option in jquery ajax:

$.ajax({ 
    url: "test.html", 
    cache: false, 
    success: function(html){ 
    $("#results").append(html); 
    } 
}); 

--- EDITAR Pruebe con esto en código C#:

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    ... 
} 
+0

mismo resultado - Veo tanto el 302 como el 200 en Firebug, pero el js ve 200 :( – Slee

+0

puede ver la URL completa de la llamada ajax ? –

+0

Por favor, complete el código JS aquí. Gracias –

0

Esta es la solución que he usado en el pasado:

lado del servidor:

Cuando estoy comprobando para ver si una sesión sigue siendo válido, también mantener un ojo hacia fuera para el " X-Requerido-Con "encabezado, que debe ser" XMLHttpRequest "si está utilizando jQuery (NOTA: IE tiende a devolver el nombre del encabezado en minúsculas, así que tenga cuidado con eso también). Si la sesión tiene de hecho expirado y la cabecera está presente, en lugar de utilizar una redirección HTTP, que responderá con un objeto JSON simple como esto:

{ "SESSION": "EXPIRED" } 

lado del cliente:

En mi código onload, utilizo Evento ajaxComplete de jQuery para verificar todas las cargas útiles de las solicitudes entrantes para el objeto caducado de la sesión. El código es como la siguiente:

$(window).ajaxComplete(function(ev, xmlhr, options){ 
    try { 
     var json = $.parseJSON(xmlhr.responseText); 
    } 
    catch(e) { 
     console.log('Session OK'); 
     return; 
    } 

    if ($.isPlainObject(json) && json.SESSION == 'EXPIRED') { 
     console.log('Session Expired'); 

     //inform the user and window.location them somewhere else 

     return; 
    } 

    console.log('Session OK'); 
}); 
0

Estoy bastante seguro de que nunca conseguirá el 302 en el estado completado del objeto XHR. Si se produce un redireccionamiento, la conexión sigue en curso hasta que vea la respuesta desde la página de inicio de sesión (que debe ser 200, si existe).

Sin embargo, ¿por qué necesita ver el 302? Seguramente si está recibiendo un redireccionamiento a login.php, simplemente obteniendo la url (o analizando el contenido) de la respuesta devuelta, ¿le informa que se han desconectado?

Una alternativa, solo si desea saber tan pronto como la sesión haya expirado (antes de que realicen alguna acción), es sondear el servidor utilizando setTimeout o similar para obtener información sobre el estado de autenticación.

Buena suerte.

7

Me gusta mucho esta solución. Al cambiar la respuesta 302 en solicitudes ajax a una 401, le permite configurar su ajax en el lado del cliente para monitorear cualquier solicitud ajax buscando un 401 y si encuentra uno para redirigir a la página de inicio de sesión. Muy simple y efectivo.

Global.asax:

código del lado del
protected void Application_EndRequest() 
{ 
    if (Context.Response.StatusCode == 302 && 
     Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
    { 
     Context.Response.Clear(); 
     Context.Response.StatusCode = 401; 
    } 
} 

Cliente:

$(function() { 
     $.ajaxSetup({ 
     statusCode: { 
      401: function() { 
      location.href = '/Logon.aspx?ReturnUrl=' + location.pathname; 
      } 
     } 
     }); 
    }); 
Cuestiones relacionadas