mercredi 7 juillet 2010

Notifier une expiration de session utilisateur en Ajax

La problématique :

Dans la plupart des applications Intranet ou Extranet, le serveur gère un délai d’inactivité pour les sessions utilisateurs. Concrètement, cela veut dire que s’il se passe un certain délai (deux heures, par exemple) pendant lequel le serveur ne reçoit aucune requête HTTP de la part du client, le serveur prend l’initiative de détruire immédiatement et définitivement la session utilisateur. Cela veut dire qu’à partir de ce moment là, les données de l’utilisateur qui étaient préalablement stockées en session ont disparu. Ce mécanisme est important pour différentes raisons :
  • Il permet de libérer de la mémoire devenue inutilisée sur le serveur
  • C’est un élément des mécaniques de sécurité, indispensables dans les applications comme le webmail ou l’accès à des comptes bancaires.

Du point de vue de l’utilisateur, l’approche n’est pas la même. En fin de matinée, Jean-Paul se connecte à notre application pour traiter un document. Puis quelques minutes plus tard, il verrouille sont poste de travail et part déjeuner avec ses collègues. A son retour, café brûlant en main, il consulte ses mails, passe un coup de téléphone, puis reprend le traitement de son document. Il saisit ses données, clique sur le bouton de validation, confirme, et là… c’est le drame ! Sa session a expiré. Il doit se reconnecter, mais surtout, il doit recommencer le traitement de son document.
Alors comment faire pour satisfaire Jean-Paul sans désactiver les sécurités présentes sur le serveur d’application ?

Une solution simple et efficace :

Voici une solution extrêmement simple et facile à mettre en œuvre :
  1. Au chargement de la page HTML, déclencher un compte à rebours en Javascript sur le client.
  2. Lorsque le compte à rebours se termine, faire un appel Ajax pour vérifier si la session est effectivement terminée.
  3. Si la session a expiré, prendre l’action adéquate (i.e. rediriger l’utilisateur vers la page de connexion).

Le compte à rebours sur le client sera initialisé avec la durée du Timeout de session sur le serveur augmentée de quelques secondes par mesure de sécurité.

Mise en œuvre avec jQuery dans un environnement JSP :

Voici un exemple d’implémentation en jQuery et JSP. Ci-dessous, le code à intégrer dans les pages HTML.




A l’expiration du compte à rebours, un appel Ajax est déclenché vers la page checksession.jsp. Dans l’exemple donné ici, l’utilisateur est redirigé vers l’URL renvoyée par checksession.jsp. Voici le code de cette page :




L’idée est de tester la valeur d’un attribut de session connu que l’on sait non vide. S’il est vide, c’est que la session a expiré, et on renvoie dans la réponse HTTP la ressource vers laquelle rediriger l’utilisateur. Simple et efficace…

Aucun commentaire:

Enregistrer un commentaire