2011-12-30 1 views
2

J'ai implémenté un projet dans MVC et là j'ai fait la plupart du temps avec une requête ajax. mais nous sommes confrontés à un problème de temps d'arrêt de session. Donc je veux quelque chose avec ajax qu'avant de faire une requête ajax il vérifie la session et ensuite traite cette requête ajax.Vérifier la session avant chaque hit Jquery Ajax

Je ne veux pas écrire si autre condition dans toute la page où je utilise l'ajax.

Veuillez suggérer un moyen.

Merci Atul

+0

Utilisez-vous la sécurité de printemps? –

+0

Non ..Je n'utilise pas la sécurité de printemps –

+1

Est-ce une application Web basée sur Java? –

Répondre

1

Peut-être que vous devriez vérifier jQuery.ajaxPrefilter() (http://api.jquery.com/jQuery.ajaxPrefilter/). En outre, ne pouvez-vous pas modifier les paramètres de votre pool d'applications concernant le délai d'inactivité pour éviter le délai d'attente de session?

+0

$ .ajaxPrefilter fonctionne aussi pour $ .get –

+0

Est-ce que $ .ajaxPrefilter() est appliqué avant qu'un appel à $ .ajax() n'arrive dans une application ? –

0

Une façon que je l'ai fait dans un projet était de mettre en œuvre une demande ajax keep-alive qui est envoyé en arrière-plan à un certain intervalle ... pour que votre session ne soit pas expiré ...

Peut-être pas une façon très élégante mais il a travaillé :)

+0

Mais le point de fin de session est d'invalider le session s'il n'y a pas d'activité pendant une certaine période de temps, non? –

+0

Oui, mais il existe des scénarios dans lesquels vous ne voulez pas que la session expire (dans mon projet, il s'agissait d'une petite application intranet et le délai d'expiration de session php ne pouvait pas être réinitialisé) ou si vous aviez une page d'édition ou un blog où le temps d'insertion de texte peut prendre un certain temps ... – Vapire

0

J'ai eu le même problème avec l'architecture de sécurité jQuery-ajax, spring mvc et spring.

La solution que j'ai suivie était la suivante.

Si un délai d'attente de session se produit, la sécurité du ressort redirigera la demande vers le contrôleur de formulaire de connexion.

Dans le contrôleur de connexion, vérifiez si la requête (Requête enregistrée) est une requête ajax (présente l'en-tête x-requested-with), s'il s'agit d'une requête ajax, renvoyez une valeur json/xml indiquant le délai. ex: {"session-timeout" : true}.

Ensuite, testez cette valeur ajax retournée en utilisant un événement jQuery ajax global comme ajaxSuccess/ajaxError pour voir s'il y a eu un timeout de session et prenez les actions que vous voulez.

Vous pouvez essayer quelque chose comme ceci en utilisant le framework d'application que vous utilisez.

0

Vous pouvez créer un global filter; un filtre global affecte chaque action du contrôleur, peut vérifier si la session existe, puis rediriger vers la page de connexion ou faire quelque chose conformément. En outre, vous pouvez garder la session en vie à la place en créant une vue que vous ping avec AJAX ou un iframe qui maintient les demandes au serveur, ainsi la session reste vivante. La question est de savoir si vous voulez la session de rester en vie aussi longtemps alors ...

1

que je suis autour de cette question aujourd'hui et voici ma solution:

Cette partie php (fichier ou méthode du contrôleur) sera appelé par ajax:

// create your preferred way of returning a json object like { "isLogged": true } 
echo json_encode(array('isLogged' => checkSession())); 

maintenant, mettez ce script au début de toutes vos pages qui ont des appels ajax et exigent que l'utilisateur connecté:

$(document).ajaxSend(function(e, xhr) { 
    $.ajax({ 
     url: 'checkSession.php', 
     type: 'GET', 
     global: false, 
     success: function(session) { 
      if(!session.isLogged) { 
       xhr.abort(); 

       // This allows my framework to take care of the redirect 
       // and to remember the intended page, 
       // so it redirects back here after login: 
       location.reload(); 

       // use this one to redirect directly to the login page: 
       // window.location.replace('login.php'); 
      } 
     }, 
     dataType: 'json' 
    }); 
}); 

le global: false partie est essentielle ici, pour empêcher cet appel ajax d'entrer le ajaxSend et donc de créer une boucle infinie.

Questions connexes