2009-04-06 5 views
3

J'utilise django et jquery pour implémenter des sessions authentifiées et des requêtes Ajax.Comment un rappel Ajax peut-il réaliser que la session authentifiée d'un utilisateur a expiré?

J'ai des délais de session authentifiés pour consigner les utilisateurs authentifiés après une longue période d'inactivité sur mon site. Certaines pages de mon site contiennent beaucoup d'appels AJAX qui nécessitent que l'utilisateur soit dans une session authentifiée. Lorsqu'un utilisateur laisse une telle page ouverte pendant une longue période et que la session est automatiquement interrompue, tous les appels AJAX effectués échouent et affichent une erreur de navigateur. Ma pile Web (django) renvoie une redirection pour se connecter à ces requêtes AJAX, mais elles apparaissent simplement comme des erreurs à $ .ajax() (en utilisant jquery.)

Comment puis-je recharger la page et envoyer l'utilisateur à la page de connexion via une requête AJAX lorsque je trouve que leur session d'authentification a expiré?

Répondre

7

Une façon serait d'avoir un script qui cingle juste une page voyez s'il est toujours connecté, mais cela augmenterait le nombre de requêtes AJAX que vous auriez à faire.

Une autre option est d'avoir la fonction complete de $.ajax() vérifier le code d'état HTTP sur l'objet XMLHttpRequest qui est passé dans:

$.ajax({..., complete = function(xhr, textStatus){ 
    if(xhr.status > 300 && xhr.status < 400) //you got a redirect 
     window.location.href = '/login/'; 
    ... 
    }, ...); 
+0

ne sait pas si la fonction jquery complete fournit une sorte de magie, mais la plupart des navigateurs gèrent les réponses de redirection de façon transparente, ce qui signifie que la réponse reçue par le callback sera la redirection, avec le statut 200. à moins que je me trompe, mais c'est ce à quoi je suis confronté dans extjs. –

1

Simple vraiment, ont tout script que vous interrogez retourner une sorte de code d'erreur, peut-être

{'error', 'notloggedin'} 

alors, tout ce que vous devez faire est de vérifier cette valeur dans votre javascript. Si on le trouve, alors vous faites quelque chose comme

window.location.href = '/login/'; 

pour faire le javascript redirection vers la page de connexion (modifier le chemin si nécessaire)

+0

Avec la méthode auth django le cadre de django tente de rediriger la requête vers la " login "url avec un suivant de la page que vous essayiez d'accéder. Donc, cette approche ne fonctionnerait pas dans ce cas. – MikeN

+0

@MikeN: Je pense que la suggestion de Martin fonctionnera toujours pour vous. Au lieu d'utiliser les décorateurs auth, utilisez la fonction user_passes_test dans votre vue. Vous pouvez alors obtenir settings.LOGIN pour revenir à l'appelant AJAX si cela échoue. –

+0

@MikeN: URL pour user_passes_test dans les documents: Voir: http://docs.djangoproject.com/fr/dev/topics/auth/#limiting-access-to-logged-in-users-that-pass-a- test –

Questions connexes