|
Servlet & JSP - Développement Web
3.3.Implémentation avancée
Nous avons
vu, dans la partie précédente, les bases pour le
développement de servlet. Nous allons à présent
nous attarder sur des concepts plus avancés.
3.3.1.Les cookies
3.3.1.1.Principe
Les
cookies sont de petites informations textuelles envoyées par
le serveur et renvoyé par le client, sans modification de sa
part, à chaque visite ultérieure. Cette technique peut
être très intéressante pour garder une trace des
visiteurs (savoir s’il est déjà venu sur le site
ou non …).
3.3.1.2.Avantages
Les cookies permettre de garder un lien entre le client et sa session
sur un serveur par le biais d’un identifiant de session par
exemple.
L’utilisation des cookies est très simple à
mettre en place et permet de gérer un ensemble de
fonctionnalités intéressantes pour le visiteur.
3.3.1.3.Inconvénients
Les cookies sont transmis à chaque requête, cela peut
alourdir les demandes et réponses du client si ces cookies
sont utilisés abusivement.
L’utilisation de cookies n’est pas à préconiser
pour une utilisation sécurisée, en effet les valeurs de
chaque paramètre sont passées en clair dans la requête
et peuvent être récupérées par un pirate
assez facilement.
Les cookies ne sont pas toujours acceptés par le client, cela
peut poser un énorme problème lorsqu’un système
n’a pas de moyen en parallèle mis en place.
3.3.1.4.Création de cookies
Les
servlets ont leur propre API de cookies. Les cookies sont représentés
par l’objet Cookie. Voici une description de cette
classe :
-
Le constructeur Cookie (String name, String value) :
constructeur qui prend en paramètre le nom du cookie et sa
valeur assignée.
Une fois l’objet cookie instancié, vous pouvez spécifier
certains attributs de celui-ci (ce sont des « setters »)
ou récupérer une information d’un cookie via le
« getter » correspondant :
-
La méthode String getComment(): retourne
le commentaire
-
La méthode setComment (String): assigne
un commentaire
-
La méthode String getDomain(): retourne le
domaine
-
La méthode setDomain (String domainPattern) :
assigne un domaine
-
La méthode int getMaxAge(): retourne la durée
en secondes avant que le cookie soit périmé
-
La méthode setDomain (int lifetime) :
indique la durée en secondes avant que le cookie soit
périmée, la valeur 0 indique que le cookie doit être
supprimé.
-
La méthode String getName() : retourne le
nom du cookie
-
La méthode setName (String name) : assigne
un nom au cookie
-
La méthode String getPath () : retourne le
chemin d’un cookie
-
La méthode setPath (String path) :
assigne un chemin au cookie (permet d’indiquer que le cookie
n’est utilisé que pour certains niveaux dans le site)
-
La méthode boolean getSecure () : retourne
true si le cookie est transmis que pour les connexions sécurisées
-
La méthode setSecure (boolean secureFlag) :
positionne le drapeau d’indication de transmission.
-
La méthode String getValue () : retourne
la valeur du cookie
-
La méthode setValue (String cookieValue) :
assigne ou modifie la valeur du cookie
Une fois le cookie paramétré il faut le rajouter à
l’en-tête http : Set-Cookie. Pour cela vous avez
juste à appeler la méthode addCookie de
l’objet de réponse de votre servlet.
Voici un exemple de création de cookie :
Cookie
cookieDejaVenu = new
Cookie(“dejaVenu”, “1”);
cookieDejaVenu.setMaxAge(60 *
60 * 24 * 365); // 1 an
res.addCookie(cookieDejaVenu);
3.3.1.5.Lecture des cookies
Les cookies reçus sont stockés dans un tableau que l’on
peut récupérer par l’instance de l’objet
HttpServletResquest via la méthode getCookies().
Celle-ci renvoie un tableau dont la longueur représente le
nombre de cookie envoyé (si la longueur est égale à
nulle, aucun cookie n’a été envoyé). Pour
obtenir un cookie en particuliers à partir de son nom vous
devez parcourir le tableau en appelant pour chaque élément
la méthode getName() jusqu’à temps
d’arriver sur le cookie qui vous intéresse.
Une fois récupérer vous avez juste à appeler la
méthode getValue() pour récupérer
son contenu.
Voici un
exemple de création de cookie :
public
void doGet (HttpServletRequest req,HttpServletResponse
res )
throws
ServletException, IOException
{
// Initialisation
PrintWriter out =
res.getWriter();
res.setContentType
(“text/html”);
Cookie [] tabCookies =
req.getCookies();
Cookie cookie;
// Boucle qui affiche tous les
cookies
for
(int i = 0; i <
tabCookies.length; i++)
{
cookie = tabCookies [i];
out.println(“Cookie : ”
+ i + “<br>” +
“ - Nom : ” +
cookie.getName() + “<br>” +
“ - Valeur : ” +
cookie.getValue() + “<br>”);
}
out.flush();
out.close();
}
Si vous
voulez supprimer un cookie, il suffit d’attribut une durée
de vie à 0 à votre objet cookie :
c1.setMaxAge(0);
3.3.2.Les sessions
3.3.2.1.Présentation
Nous avons vu précédemment comment garder des
informations chez le client par le biais de cookie. Cependant ce
mécanisme est très limité, c’est donc pour
cela que le système de session a été mis en
place.
Lorsque l’on parle de session, l’activité se passe
côté Serveur et non Client (contrairement aux cookies).
Les sessions sont très utilisées dans les applications
web et plus particulièrement dans les sites e-business …
Elles permettent de stocker des informations pour chaque client côté
serveur.
3.3.2.2.Avantages
Les sessions sont exécutées côté serveur
ce qui leur permet d’être beaucoup plus sécurisées
que les cookies.
Un seul identifiant est nécessaire pour lier le serveur et le
client car les données sont stockées sur le serveur.
Les sessions sont simples d’utilisation grâce à
l’API de suivi de session des servlets.
3.3.2.3.Inconvénients
Un lien doit être mis en place entre le client et le serveur
(identifiant de session) soit par cookie soit par le mécanisme
de réécriture d’URL.
3.3.2.4.API de suivi de session
Les servlets possèdent une API pour la gestion des sessions.
L’utilisation de sessions dans les servlets est très
simple car il suffit de récupérer l’objet session
lié à la requête actuelle. Si aucun objet de
session n’a encore été créé, on
peut décider de le créer automatiquement.
La classe
décrivant une session est : HttpSession.
Voici une
description de chacun des méthodes de celle-ci :
-
La méthode Object getValue () ou Objet
getAttribute (String name) : retourne la valeur d’un
attribut de la session précédemment ajouté.
Remarque : la méthode getValue()
est à remplacer par getAttribute() depuis la
version 2.2 de l’API des servlets.
-
La méthode putValue (String name, Object value)
ou setAttribute (String name, Object value) :
associe un objet à un nom d’attribut de la session.
Remarque : la méthode putValue est à
remplacer par setAttribute depuis la version 2.2 de
l’API des servlets.
-
La méthode removeValue (String name) ou
removeAttribute (String name) : supprime un
attribut à partir de son nom.
Remarque : la méthode removeValue
est à remplacer par removeAttribute depuis la
version 2.2 de l’API des servlets.
-
La méthode String [] getValueNames() ou
Enumeration getAttributeNames () : retourne les
noms de tous les attributs de la session.
Remarque : la méthode getValueNames
est à remplacer par getAttributeNames depuis la
version 2.2 de l’API des servlets.
-
La méthode String getId() :
retourne l’identifiant unique de la session (il peut être
utilisé comme une clé ).
-
La méthode boolean isNew() :
retourne true si la session vient d’être créées
(nouvelle session) ou false dans le cas d’une session
déjà existante.
-
La méthode invalidate() : invalide l’ensemble
de la session et libère tous les objets qui y sont associés.
3.3.2.5.Gestion de la session
Tout d’abord il vous faut récupérer l’objet
session associé à la requête cliente, pour
appeler la méthode : getSession de
l’objet HttpServletRequest.
HttpSession session =
req.getSession (true);
Pour que la session soit créée automatiquement (dans le
cas où elle n’existerait pas), nous passons true
en paramètre à la méthode getSession.
Remarque : Si on passait false en paramètre,
la méthode getSession nous retournerait un objet
null.
Avec cet objet session, vous allez pouvoir lui ajouter des
objets (méthode setAttribute), en retirer
(méthode removeAttribute) ou en lire (méthode
getAttribute).
3.3.3.L’interface
SingleThreadModel
Nous avons vu qu’une servlet n’a qu’une seule
instance qui est ‘attaquée’ par plusieurs threads
à la fois (1 thread par client). Ceci peut parfois être
gênant lorsque l’on veut, par exemple, qu’un objet
de connexion à une base de données ne soit pas partagé
parmi les threads, la modification d’un fichier précis
…
Une première solution serait d’affecter l’attribut
synchronized à la méthode service
de la servlet.
Cependant il existe un meilleur moyen de gérer cela. En effet,
il existe l’interface SingleThreadModel qui permet
d’indiquer au moteur de servlets que l’on souhaite qu’une
instance de la servlet ne soit « attaquée »
que par un Thread à la fois.
Cette interface ne comporte aucune méthode à
implémenter, elle ne représente qu’un drapeau
pour le moteur de servlet.
Finalement cette interface est pratique car elle permet en quelques
sortes de sécuriser les accès concurrents, cependant ce
n’est pas la meilleure solution. L’idéal est de
créer dans le cas d’une connexion à la base de
données, une gestion de pool de connexions multithreadées.
En effet, il se peut que la base de données n’accepte
qu’un nombre restreint de connexions (qui peut être
dépassé par le nombre de clients accédant à
la servlet).
3.3.4.Utilisation du ServletContext
On appelle contexte associé à la servlet
(ServletContext) l’environnement au sein duquel la
servlet s’exécute. L’objet ServletContext
est créé par le containeur de servlet et permet
d’accéder à des informations rattachées à
l’environnement.
L’objet créé est partagé par toutes les
servlets du containeur. Cela permet donc de partager des informations
entre les servlets.
3.3.4.1.Description de l’objet
ServletContext
Voici une description des méthodes principales de l’objet
ServletContext :
-
La méthode Object getAttribute(String name) :
retourne l’attribut associé à name
-
La méthode setAttribute(String name, Object o) :
assigne un objet à un nom d’attribut
-
La méthode removeAttribute(String name) :
supprime un attribut du context
-
La méthode Enumeration getAttributeNames()
: retourne la liste des attributs du contexte
-
La méthode int getMajorVersion() :
retourne la dernière version supportée par
l’environnement
-
La méthode int getMinorVersion() : retourne la
première version minimale supportée
3.3.4.2.Utilisation l’objet
ServletContext
L’accès
au context se fait par le biais de la méthode
getServletContext() de la servlet. L’objet
récupéré est du type ServletContext.
|
|
 |