ISI 1022 : Programmation Internet et Java J2EE : Suivi de Sessions Programmation Internet et Java Jean-Noël Sorenti. Année 2002/2003 Le Suivi de session sous J2EE ISI 1022 : Programmation Internet et Java 1 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java J2EE : Suivi de Sessions l Programmation Internet et Java Une application Web peut avoir besoin de conserver des informations avec un client : • Quel Client présente quelle requête ? • Quelles sont les requêtes précédant celle-ci ? l Exemples : • Ouverture de session (login) pour des raisons de • • sécurité Gestion de réservation Gestion de caddies pour le commerce électronique. 2 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java J2EE : Problème de HTTP l Programmation Internet et Java HTTP est un protocole sans état : • A chaque requête, on a toujours les étapes de connexion et déconnexion. • HTTP ne peux pas faire de lien direct entre deux requêtes consécutives d’un même utilisateur. • La Solution sera d’attribuer un ID temporaire pour chaque utilisateurs. 3 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java J2EE : Utilisation d’un ID pour le suivi de Sessions l Gestion de L’ID pour les session : ID1,ID2 n’existent pas, il sont créés Client 1 Client 2 Client 1 Client 2 ID 1 ID 1 ID 2 ID 2 ID 1 ID 1 ID 2 ID 2 Table d’ID ID 1 ID 2 Identifié ! 4 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java J2EE : Solution de l’ID l Programmation Internet et Java Solution pour la gestion des sessions : • Cookie temporaire (avec ID Stocké dedans) : • C’est à l’aide d’un cookie que la gestion des sessions est gérée automatiquement par l’Api Servlets/JSP. • Cette gestion est transparente pour les programmeurs (100% automatisée). Il suffit que le Web Browser accepte les cookies. • ID en champ caché ou dans l’URL : • Si le navigateur Web n’accepte pas les cookies, l’ID devra être présent dans les pages HTML que reçoit le client, pour être renvoyé par la suite au Serveur. L’Api Servlet/JSP possèdera alors des fonctions simple pour cette gestion. 5 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java J2EE : Solution de l’ID sans l’aide de cookies. l Si les cookies sont désactivés, il faut alors utiliser la réécriture de l’URL à la place : • Utilisation de HttpServletResponse.encodeURL(‘’ ‘’) • Toutes les URL dépendantes des sessions devront • être encodées. Exemple dans un fichier JSP : … <FORM ACTION=‘<%=response.encodeURL(‘/path’)%>’ > … • Dans l’exemple, encodeURL permet d’ajouter automatiquement l’ID au champ ACTION. 6 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java J2EE : Suivi de Sessions l Nous avons une session par client : Table d’ID Client 1 ID 1 Session 1 Client 2 ID 2 Session 2 Client 3 ID 3 Session 3 7 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java J2EE : Classe HttpSession l Programmation Internet et Java Nous disposons dans J2EE Servlet d’un objet session par utilisateur : • L’objet de session implémente l’interface HttpSession • Il est fourni par le Serveur d’application. • On peut le récupérer avec la fonction getSession() • • disponible dans request (de HttpServletRequest) L’ID est stocké dedans Notre objet est un conteneur (comme request, context,…) 8 L’objet Session peut être récupéré avec l’objet request car ce denier comporte les informations sur le client, plus précisément son ID ! Le fait que notre objet session soit un conteneur implique que l’on pourra stocker des objets dedans et que ces derniers serons persistant pendant la session d’un utilisateur et que ces informations lui seront propres. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java J2EE : Classe HttpSession l Programmation Internet et Java Récupération de l’objet Session avec la méthode getSession() de request : • getSession() : crée et renvoie une nouvelle session si • • aucune session n’a encore été crée ou renvoie la session existante. Identique à getSession(true). getSession(false) renvoie la session existante, mais n’en crée pas de nouvelle. HttpSession est un conteneur sous forme de table associative : • Tout Objet peut être stocké dedans avec la méthode setAttributes. • Les clefs sont des chaînes de caractères. 9 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java J2EE : Exemple du caddie l Programmation Internet et Java Exemple dans une servlet : public class ajoutDansCaddieServlet extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) { } } Caddie monCaddie = null; HttpSession session = req.getSession(); //Renvoie session courante ou //en crée une nouvelle. if (session.isNew() { monCaddie = new Caddie(); session.setAttribute(‘’caddie’’,monCaddie); } else { //Si session existe déjà alors le caddie aussi. monCaddie = (Caddie)session.getAttribute(‘’caddie’’); } monCaddie.ajoute(request.getParameter(‘’article’’)); 10 Dans cette exemple, Caddie représente un ensemble d’article. Exercice : Essayer de modéliser la classe Caddie ainsi que la servlet permettant l’ajout d’éléments dedans. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java J2EE : Invalidation et expiration de Sessions l Les sessions peuvent être invalidées à l’aide de la fonction membre : • session.invalidate(); l Elle peuvent aussi expirer après un certain temps d’inactivité : • Le délai d’attente par défaut est généralement de 30 • • minutes. Peut être défini à l’aide de la fonction HttpSession.setMaxInactiveInterval(int seconds). Peut être aussi configuré dans le fichier web.xml. 11 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java J2EE : Notification d’évènements dans une session l Un objet présent dans un conteneur session peut être averti si sa session expire ou est invalidée : • Pour que l’objet soit averti, il faudra qu’il implémente • • l’interface HttpSessionBindingListener. On pourra alors définir la méthode valueUnbound() qui serra appelée à l’expiration de la session. Utile pour libérer des ressources. 12 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java J2EE : Stockage d’informations entre sessions l On peut aussi utiliser des cookies pour stocker des informations dans le navigateur sur de longues périodes : • Le navigateur est censé prendre en charge 20 cookies par serveur – de maximum 4096 Octets chacun. • La durée de vie par défaut du cookie est maxAge = -1 (détruit à la fermeture du navigateur). • Par défaut, les cookies ne peuvent être renvoyés qu’à la servlet qui les a créés. 13 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java J2EE : Stockage d’informations entre sessions l Mise en pratique des cookies : • Pour l’utilisation de cookies, on a les éléments suivants : • HttpServletRequest.getCookies() : récupère le tableau de cookies du client. • HttpServletResponse.addCookie(new Cookie) : pour stocker un cookie chez le client. • Javax.servlet.http.Cookie : la classe du cookie ! 14 Jean-Noël Sorenti – Année 2002/2003