Gestion de la Session avec un Filter

Les applications présentes sur le Web peuvent nécessiter une connexion afin de proposer des services spécifiques. Afin de bloquer les accès sur certaines pages de nos applications, il est nécessaire de filtrer les accès aux différentes URLs de l’application. La session doit ensuite contenir les informations de l’utilisateur et être testée à chaque action. Pour cela, il est possible d’utiliser un Filter dont la méthode principale va être appelée à chaque accès à une Servlet.

javasession

Définition

Nous allons d’abord créer le Filter qui va nous permettre de réaliser les tests sur l’objet Session.

Dans cette classe, nous avons trois méthodes principales.

La méthode init() va être appelée à l’instanciation du Filter. Nous l’utilisons pour initialiser les URLs qui n’ont pas besoin d’être vérifiées, l’exemple le plus simple étant l’URL de la page de connexion elle-même.

La méthode doFilter() est celle qui va faire le traitement. Elle est appelée à la réception de chaque requête HTTP sur l’application. Elle prend en paramètres les objets Request et Response qui sont normalement passés à la Servlet ainsi qu’un objet chain qui va permettre d’agir sur le flux de la requête HTTP. Dans cette méthode nous allons en premier lieu vérifier que l’utilisateur est authentifié ou que l’URL demandé n’est pas protégée. Si c’est le cas alors le Filter va transmettre la requête de manière transparente avec chain.doFilter(res,response);. Dans le cas contraire, j’ai personnellement choisi de rediriger l’utilisateur sur la Servlet de connexion qui va lui proposer le formulaire de login/password. Dans la méthode isAuthorized(), j’indique au Filter de laisser passer les URLs présentes dans le paramètre avoid-urls ainsi que les fichiers présents dans les dossiers CSS et JavaScript pour qu’ils ne soient pas traités.

La méthode destroy() appelée à la fin de la vie du Filter, avant que celui-ci ne soit détruit. On peut y détruire des objets complexes nécessitant une fermeture manuelle.

Attention, la méthode request.getSession() possède deux déclarations. La première sans paramètre va automatiquement créer l’objet Session associé à l’utilisateur si il n’existe pas. La seconde passe un booléen en paramètre, et en fonction de ce paramètre va créer ou non la session pour l’utilisateur courant.

Configuration

Une fois ce Filter mis en place, il faut paramétrer notre web.xml pour que les requêtes HTTP passent par le Filter.

Les balises filter et filter-mapping se placent dans la racine de notre web.xml. La première est constituée d’un nom purement descriptif, de la définition de la classe associée et les paramètres à envoyer à la classe lors de l’initialisation. Ici, on retrouve notre paramètre avoid-urls qui a pour valeur l’URL de ma page de connexion. La balise filter-mapping va associer le nom du filter et le pattern correspondant aux URLs à filtrer. Ainsi, mon Filtre s’applique à toutes les URLs de mon application, et une fois dans le Filter, je redirige vers la page Connection qui n’est pas bloquée si la session n’est pas présente.

Petit Plus

Ajout de la Session

Une fois notre filtre paramétré et prêt à être utilisé, il faut pouvoir connecter notre utilisateur. Pour cela nous allons créer l’objet Session et lui ajouter un objet User à notre Session.

Ainsi, notre User est stocké en session. Le Filter le détectera et permettra l’accès à des pages protégées. (Vous remarquerez que j’utilise la méthode getSession() sans paramètre pour qu’elle soit créée si elle n’existe pas)

Définition du délai d’expiration

Il peut être intéressant de définir le temps d’expiration de la Session, en fonction du niveau de sécurité que vous voulez donner à votre application principalement. Avec une Session de courte durée, il y a moins de risque qu’un utilisateur étourdi laisse l’accès ouvert trop longtemps à votre application, mais cela peut également très vite agacer des utilisateurs qui sont obligés de se reconnecter dix fois par jour. Adaptez à vos besoins! Pour définir le délai d’expiration, ajouter ces lignes dans la web-app de votre web.xml.

spacer

Laisser un commentaire