2009-08-12 13 views
10

J'utilise jQuery et le plugin jQuery.form pour soumettre mon formulaire (également en utilisant ASP.Net MVC). Problème est l'utilisateur est dans une section du site qui utilise l'authentification par formulaires et si leur cookie d'authentification expire pendant leur temps sur la page au lieu de récupérer un statut de 302, qui serait la redirection vers la page de connexion, Je reçois toujours 200?jQuery AJAX voir redirection en tant que statut 200 non 302?

Dans FireBug, je vois le 302 trouvé, puis ma page de connexion est servie en tant que 200 qui est le code d'état renvoyé à mon appel Ajax. Comment puis-je détecter qu'ils ont été déconnectés si je ne vois jamais le 302 renvoyé au plugin de formulaire jQuery?

+0

Avez-vous essayé de vérifier le cookie d'authentification? On dirait qu'il serait plus facile de vérifier le cookie pour détecter si l'utilisateur est connecté. – user120242

Répondre

0

essayer avec cache: false cache option in jquery ajax:

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

--- EDIT Essayez avec ce code en C#:

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

même résultat - Je vois à la fois le 302 puis le 200 dans Firebug bout le js voit 200 :( – Slee

+0

peut voir l'url complète de l'appel ajax ? –

+0

Veuillez compléter le code JS ici merci –

0

C'est la solution que je l'ai utilisé dans le passé:

côté serveur:

Quand je vérifie si une session est toujours valide, je garde aussi un œil sur la " X-Requested-With "en-tête, qui devrait être" XMLHttpRequest "si vous utilisez jQuery (NOTE: IE a tendance à retourner le nom de l'en-tête en minuscules, alors attention à cela aussi). Si la session a en effet expiré et l'en-tête est présent, au lieu d'utiliser une redirection HTTP, je réponds avec un simple objet JSON comme ceci:

{ "SESSION": "EXPIRED" } 

côté client:

Dans mon code onload, j'utilise L'événement ajaxComplete de jQuery vérifie toutes les charges utiles de demande entrantes pour l'objet expiré de la session. Le code ressemble à ceci:

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

Je suis sûr que vous ne serez jamais le 302 dans l'état rempli de l'objet XHR. Si une redirection se produit, la connexion est toujours en cours jusqu'à ce que vous voyiez la réponse de la page de connexion (qui devrait être 200, si elle existe).

Cependant, pourquoi avez-vous besoin de voir le 302? Sûrement si vous obtenez une redirection vers login.php alors simplement obtenir l'URL (ou l'analyse du contenu) de la réponse renvoyée vous indique qu'ils ont été déconnectés? Une alternative, seulement si vous voulez savoir dès que la session a expiré (avant de faire quelque action), est d'interroger le serveur en utilisant setTimeout ou similaire pour obtenir des informations sur l'état d'authentification.

Bonne chance.

7

J'aime vraiment cette solution. En changeant la réponse 302 sur les requêtes ajax en 401, il vous permet de configurer votre ajax côté client pour surveiller toute requête ajax à la recherche d'un 401 et s'il en trouve un à rediriger vers la page de connexion. Très simple et efficace.

Global.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 Code Side:

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