2009-08-12 12 views
10

Sto usando jQuery e il plugin jQuery.form per inviare il mio modulo (utilizzando anche ASP.Net MVC).jQuery AJAX vedere il reindirizzamento come stato 200 e non 302?

Problema: l'utente si trova in una sezione del sito che utilizza l'autenticazione basata su form e se il relativo cookie di autenticazione scade durante il loro tempo sulla pagina invece di ripristinare lo stato 302, che sarebbe il reindirizzamento alla pagina di accesso, Ne ho ancora 200?

In FireBug vedo il 302 Found e poi la mia pagina di accesso viene servita accanto a 200, che è il codice di stato inviato alla mia chiamata Ajax. Come posso rilevare che sono stati disconnessi se non ho mai visto il 302 rimandato al plugin del modulo jQuery?

+0

Hai provato controllando il cookie di autenticazione? Sembra che sarebbe più facile controllare il cookie per rilevare se l'utente ha effettuato il login. – user120242

risposta

0

provare con la cache: false cache option in jquery ajax:

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

--- EDIT Prova con questo in codice C#:

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

stesso risultato - Vedo sia il 302 che il 200 in Firebug butt che js vede 200 :( – Slee

+0

può vedere l'url completo della chiamata ajax ? –

+0

Si prega di completare il codice JS qui. Grazie –

0

Questa è la soluzione che ho usato in passato:

lato server:

Quando sto controllando per vedere se una sessione è ancora valido, ho anche tenere d'occhio per il " X-Requested-With "header, che dovrebbe essere" XMLHttpRequest "se stai usando jQuery (NOTA: IE tende a restituire il nome dell'intestazione in minuscolo, quindi guarda anche quello). Se la sessione ha infatti scaduto e l'intestazione è presente, invece di utilizzare un reindirizzamento HTTP, io rispondere con un oggetto JSON semplice come questo:

{ "SESSION": "EXPIRED" } 

lato client:

Nel mio codice onload, io uso L'evento ajaxComplete di jQuery per controllare tutti i payload delle richieste in entrata per l'oggetto della sessione scaduta. Il codice è simile al seguente:

$(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

Sono quasi sicuro che non si otterrà mai il 302 nello stato completato dell'oggetto XHR. Se si verifica un reindirizzamento, la connessione è ancora in corso finché non viene visualizzata la risposta dalla pagina di accesso (che dovrebbe essere 200, se esiste).

Tuttavia, perché è necessario vedere il 302? Sicuramente se stai ricevendo un reindirizzamento a login.php allora semplicemente ottenere l'url (o analizzare il contenuto) della risposta restituita ti dice che sono stati disconnessi?

Un'alternativa, solo se si desidera sapere non appena la sessione è scaduta (prima di eseguire un'azione), è eseguire il polling del server utilizzando setTimeout o simile per ottenere informazioni sullo stato di autenticazione.

Buona fortuna.

7

Mi piace molto questa soluzione. Modificando la risposta 302 su richieste Ajax su un 401, è possibile impostare l'ajax sul lato client per monitorare qualsiasi richiesta Ajax che cerca un 401 e se ne trova uno per reindirizzare alla pagina di accesso. Molto semplice ed efficace.

Globale.ASax:

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

client codice lato:

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