JEE : cookies, sessions et filtres
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
[Link]@[Link]
H & H: Research and Training 1 / 24
Plan
1 Introduction
2 Cookies
3 Sessions
4 Filtres
H & H: Research and Training 2 / 24
Introduction
JEE
Objectif
H I ©
ELque soit
Savoir stocker et récupérer des données quel
U
l’emplacement : Servlet, JSP...
L MO
e f
Sécuriser l’accès à notre
r E
application Web en installant des filtres
sur les Servletsch
©A
H & H: Research and Training 3 / 24
Cookies
JEE
Les cookies
H I ©
un cookie est un fichier que l’on enregistreE
U Ll’ordinateur du
sur
visiteur pour une longue durée.
L MO
il permet généralementfdeE
r e sauvegarder des données sur le
chpermet de l’identifier lors de sa prochaine visite
visiteur qui nous
© A
H & H: Research and Training 4 / 24
Cookies
JEE
Pour créer un cookie
Cookie cookie = new Cookie("nom", "wick");
H I ©
UEL
L MO
h refE
A c
©
H & H: Research and Training 5 / 24
Cookies
JEE
Pour créer un cookie
Cookie cookie = new Cookie("nom", "wick");
H I ©
UEL
MO
Pour stocker un cookie
[Link](cookie);
fE L
c h re
© A
H & H: Research and Training 5 / 24
Cookies
JEE
Pour créer un cookie
Cookie cookie = new Cookie("nom", "wick");
H I ©
UEL
MO
Pour stocker un cookie
[Link](cookie);
fE L
c h re
© A
Modifier la durée d’un cookie (par défaut la durée d’une session)
[Link](60*60*24);
H & H: Research and Training 5 / 24
Cookies
JEE
Pour rendre le cookie inaccessible en JavaScript (réduire les risques de faille
XSS)
[Link](true);
H I ©
UEL
L MO
h refE
A c
©
H & H: Research and Training 6 / 24
Cookies
JEE
Pour rendre le cookie inaccessible en JavaScript (réduire les risques de faille
XSS)
[Link](true);
H I ©
UEL
Pour récupérer des données stockées dans des cookies
Cookie cookies [] = [Link]();
L MO
h refE
A c
©
H & H: Research and Training 6 / 24
Cookies
JEE
Pour rendre le cookie inaccessible en JavaScript (réduire les risques de faille
XSS)
[Link](true);
H I ©
UEL
Pour récupérer des données stockées dans des cookies
MO
Cookie cookies [] = [Link]();
L
h re fE
A c
©
Pour chercher un cookie
for(int i= 0 ; i < [Link]; i++) {
if (cookies[i].getName().equals("nom")) {
...
}
}
H & H: Research and Training 6 / 24
Cookies
JEE
Pour récupérer le nom d’un cookie
[Link]();
H I ©
UEL
L MO
h refE
A c
©
H & H: Research and Training 7 / 24
Cookies
JEE
Pour récupérer le nom d’un cookie
[Link]();
H I ©
UEL
L MO
e f Ecookie
Pour récupérer la valeur d’un
r
A
[Link]();ch
©
H & H: Research and Training 7 / 24
Sessions
JEE
Les sessions
un moyen de conserver des données relatives à un visiteur sur
toutes les pages de notre site H I ©
UEL
MO
ces données seront enregistrées sur le serveur
L
pour chaque session, on
r e f E
peut associer une infinité de variables de
h (primitif, objet, tableau d’objets...)
session de toutctype
A
©
ces variables seront détruites, si le visiteur se déconnecte, s’il
dépasse une certaine durée...
H & H: Research and Training 8 / 24
Sessions
JEE
Considérons l’objet de type Personne suivant
Personne personne = new Personne (100, "wick", "john");
H I ©
UEL
L MO
h refE
A c
©
H & H: Research and Training 9 / 24
Sessions
JEE
Considérons l’objet de type Personne suivant
Personne personne = new Personne (100, "wick", "john");
Pour créer une variable session
H I ©
HttpSession session = [Link]();
UEL
L MO
h refE
A c
©
H & H: Research and Training 9 / 24
Sessions
JEE
Considérons l’objet de type Personne suivant
Personne personne = new Personne (100, "wick", "john");
Pour créer une variable session
H I ©
HttpSession session = [Link]();
UEL
L MO
h refE
Pour ajouter l’objet personne dans la session
A c
©
[Link]("perso", personne);
H & H: Research and Training 9 / 24
Sessions
JEE
Considérons l’objet de type Personne suivant
Personne personne = new Personne (100, "wick", "john");
Pour créer une variable session
H I ©
HttpSession session = [Link]();
UEL
L MO
h refE
Pour ajouter l’objet personne dans la session
A c
©
[Link]("perso", personne);
Pour récupérer une donnée de session (dans une Servlet)
[Link]("perso");
H & H: Research and Training 9 / 24
Sessions
JEE
Pour récupérer une donnée de session (dans une JSP)
<%
Personne p = (Personne) [Link]("perso");
[Link](p);
%>
H I ©
UEL
L MO
h refE
A c
©
H & H: Research and Training 10 / 24
Sessions
JEE
Pour récupérer une donnée de session (dans une JSP)
<%
Personne p = (Personne) [Link]("perso");
[Link](p);
%>
H I ©
UEL
L MO
h refE
Pour récupérer une donnée de session (dans une JSP avec EL)
${ [Link] }
A c
©
H & H: Research and Training 10 / 24
Sessions
JEE
Pour récupérer une donnée de session (dans une JSP)
<%
Personne p = (Personne) [Link]("perso");
[Link](p);
%>
H I ©
UEL
L MO
h refE
Pour récupérer une donnée de session (dans une JSP avec EL)
${ [Link] }
A c
©
Pour détruire une session
[Link]();
H & H: Research and Training 10 / 24
Sessions
Exercice
1 Créer un nouveau projet Java EE.
2 Créer trois Servlets FirstServlet, SecondServlet et ThirdServlet accessibles
respectivement via les chemins first, second et third.
Créer une vue [Link] contenant un formulaire d’authentification (nom d’utilisateur et
©
3
mot de passe) et placer la directement dans webapp.
H I
4
UEL
À la soumission du formulaire, les données seront envoyées au doPost() de
FirstServlet.
L MO
5
doit s’authentifier.
h re fE
Pour accéder à n’importe quelle page de l’application (hormis [Link]), l’utilisateur
A c
6
7
©
S’il réussit à s’authentifier, il sera enregistré dans la session.
Créer trois vues [Link], [Link] et [Link] dans WEB-INF appelées
respectivement par FirstServlet, SecondServlet et ThirdServlet.
8 Dans chaque vue ([Link], [Link] et [Link]), on affiche le nom de la
vue, le nom de l’utilisateur connecté, deux liens pour naviguer vers les autres vues et un
lien de déconnexion.
H & H: Research and Training 11 / 24
Sessions
JEE
Remarques
I ©
Le code qui permet de vérifier si le nom d’une personne est dans la
H
UEL
session + redirection est répétitif : dans toutes les Servlets
L MO
h refE
A c
©
H & H: Research and Training 12 / 24
Sessions
JEE
Remarques
I ©
Le code qui permet de vérifier si le nom d’une personne est dans la
H
UEL
session + redirection est répétitif : dans toutes les Servlets
L MO
h refE
Solution A c
©
Utiliser les filtres pour tester avant d’arriver dans la Servlet
H & H: Research and Training 12 / 24
Filtres
JEE
Filtre
Classe Java implémentant l’interface Filter ayant les méthodes
init(), destroy(), doFilter()
H I ©
UEL
Défini par rapport à une URL (soit dans le fichier [Link], soit
avec l’annotation @WebFilter()
L MO
h refE
s’exécute avant la Servlet ayant la même URL
A c
Un filtre avec l’URL /* se lance avant toutes les Servlets de
l’application©
Une fois l’exécution du filtre est terminé, il passe la main à un
autre, avec la méthode [Link]() (s’il en existe), sinon
c’est la Servlet qui sera exécutée.
H & H: Research and Training 13 / 24
Filtres
JEE
Vue Modèle
(page JSP) (Java Bean)
H I ©
UEL
MO
Filter
L
Requête
h refE
HTTP
A c
© Contrôleur
(Servlet)
Réponse
HTTP
Client Serveur
H & H: Research and Training 14 / 24
Filtres
JEE
Création d’un filtre sous Eclipse
Faire un clic droit sur src situé dans Java Resources de notre
projet
H I ©
UEL
MO
Aller dans New et choisir Filter
fE L
Remplir le champ Java package: par [Link]
c h re
© A
Remplir le champ Class name: par un nom suffixé par le mot
Filter : PrivateFilter (par example)
Cliquer sur Next
H & H: Research and Training 15 / 24
Filtres
Code généré
@WebFilter("/PrivateFilter")
public class PrivateFilter implements Filter {
public PrivateFilter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
H I ©
UEL
}
response,
L MO
public void doFilter(ServletRequest request, ServletResponse
FilterChain chain) throws IOException,
ServletException {
h refE
// TODO Auto-generated method stub
// place your code here
A c
©
// pass the request along the filter chain
[Link](request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
H & H: Research and Training 16 / 24
Filtres
JEE
Les filtres
I ©
Supprimer toutes les méthodes de filtre et garder seulement
H
doFilter()
UEL
L MO
Implémenter cette dernière pour qu’elle vérifie si un nom est dans
la session
h re fE
c
Alancé avant l’exécution de toutes les URL sauf
Filtre doit être
©affichent
celles qui et vérifient le formulaire d’authentification
H & H: Research and Training 17 / 24
Filtres
JEE
Contenu d’[Link]
<%@ page language="java" contentType="text/html; charset=ISO
-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
H I ©
UEL
<head>
<title>Home page</title>
</head>
L MO
fE
<body>
<h1>Home page</h1>
c
<form action=first method=post> h re
© A
<input type=text name=nom placeholder="saisir nom"><br>
<input type=password name=pwd placeholder="saisir mot de
passe"><br>
<button type="submit"> Connection </button>
</form>
</body>
</html>
H & H: Research and Training 18 / 24
Filtres
Contenu de FirstServlet
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
getServletContext().getRequestDispatcher("/WEB-INF/[Link]").
forward(request, response);
H I ©
UEL
}
protected void doPost(HttpServletRequest request, HttpServletResponse
// TODO Auto-generated method stub
L MO
response) throws ServletException, IOException {
h refE
String nom = [Link]("nom");
String pwd = [Link]("pwd");
A c
if ([Link]("wick") && [Link]("john")) {
©
[Link]().setAttribute("nom", nom);
getServletContext().getRequestDispatcher("/WEB-INF/[Link]").
forward(request, response);
}
else
getServletContext().getRequestDispatcher("/[Link]").forward(
request, response);
}
}
H & H: Research and Training 19 / 24
Filtres
JEE
Contenu de [Link] (même logique pour [Link] et [Link])
<!DOCTYPE html>
<html>
<head>
<title>First page</title>
</head>
<body>
<h2>First page</h2>
H I ©
UEL
<c:out value="Bonjour ${ [Link] }"/>
MO
<div>
<c:url value="second" var="second" />
<a href="${ second }"> second </a>
fE L
</div>
<div>
c h re
© A
<c:url value="third" var="third" />
<a href="${ third }"> third </a>
</div>
<div>
<c:url value="deconnect" var="deconnect" />
<a href="${ deconnect }"> déconnexion </a>
</div>
</body>
</html>
H & H: Research and Training 20 / 24
Filtres
JEE
Contenu de SecondServlet (même logique pour ThirdServlet)
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
H I ©
UEL
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
L MO
fE
getServletContext().getRequestDispatcher("/WEB-INF/[Link]").
re
forward(request, response);
}
A c h
©
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
H & H: Research and Training 21 / 24
Filtres
JEE
Contenu de PrivateFilter
@WebFilter("/*")
public class PrivateFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
H I ©
UEL
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = [Link]();
MO
// on récupère le nom de la session
L
String nom = (String)[Link]("nom");
re fE
// on récupère le chemin demandé par l'utilisateur
h
String chemin = [Link]();
A c
// on récupère la méthode HTTP utilisée (GET ou POST)
©
String methode = [Link]();
if (nom != null || [Link]("/") || [Link]("/[Link]") || [Link]("/
first") && [Link]("POST"))
[Link](request, response);
else
[Link]([Link]());
}
}
H & H: Research and Training 22 / 24
Filtres
JEE
On peut aussi supprimer l’annotation @WebFilter et utiliser le
[Link] comme pour les Servlets
<filter>
<filter-name>PrivateFilter</filter-name>
H I ©
UEL
<filter-class>[Link]</
filter-class>
L MO
</filter>
h re fE
c
©A
<filter-mapping>
<filter-name>PrivateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
H & H: Research and Training 23 / 24
Filtres
JEE
Remarques
H I ©
Si on a plusieurs filtres sur une même URL, l’ordre de vérification
UEL
est l’ordre de déclaration de la section filter-mapping dans
MO
[Link].
fE L
Si on a plusieurs filtres sur une même URL, et qu’on utilise
h re
l’annotation @WebFilter, il faut quand-même préciser l’ordre
c
A
d’exécution dans [Link] en ajoutant une section
©
filter-mapping pour chaque filtre.
H & H: Research and Training 24 / 24