Vous êtes sur la page 1sur 69

Les Servlets

Thierry Lecroq
(merci à Alexandre Pauchet (INSA Rouen))

Université de Rouen
FRANCE

Thierry Lecroq (Univ. Rouen) Servlets 1 / 69


Plan

1 Introduction

2 API

3 Paramètres

4 Encodage

5 Filtrage

6 Partage du contrôle

7 Session

8 Authentication

Thierry Lecroq (Univ. Rouen) Servlets 2 / 69


Introduction (1/8)
Description

Que sont les Servlets ?


Application java
Exécutée côté serveur
Traitement de requêtes HTTP et génération de réponses dynamiques
⇒ comparable aux CGI
Permet d'étendre les fonctionnalités de base d'un serveur HTTP
Quelques avantages :
I portabilité (java)
I puissance avec l'accès à la totalité de l'API java

I rapidité (la Servlet est chargée une seule fois)

Thierry Lecroq (Univ. Rouen) Servlets 3 / 69


Introduction (2/8)
Fonctionnement des CGI

Thierry Lecroq (Univ. Rouen) Servlets 4 / 69


Introduction (3/8)
Fonctionnement des Servlets

Thierry Lecroq (Univ. Rouen) Servlets 5 / 69


Introduction (4/8)
Application Web

Une application web est composée


de Servlets/JSP
de bibliothèques de classes annexes,
de ressources statiques (images, HTML, XHTML, . . . ),
un descripteur de déploiement (chier XML)

Thierry Lecroq (Univ. Rouen) Servlets 6 / 69


Introduction (5/8)
Vocabulaire J2EE

J2EE et les applications Web


Composant Web : Servlets et JSP
Application Web : ensemble de composants web, bibliothèques et
ressources statiques dont l'organisation est décrite dans un descripteur
de déploiement
Conteneur Web :
I environnement d'exécution et de distribution des composants web et

des ressources statiques


I gère le cycle de vie des Servlets (intanciation, initialisation, . . . )

Thierry Lecroq (Univ. Rouen) Servlets 7 / 69


Introduction (6/8)
Exemple de Servlet : le chier appelant

Hello.html
<? xml version =" 1.0 " encoding =" iso -8859 -1 " ? >
<!DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Strict // EN " " DTD / xhtml1 - strict . dtd " >
< html xmlns =" http :// www . w3 . org /1999/ xhtml " xml : l a n g =" fr " >
< head >
< t i t l e >Ma premi & eacute ; re Servlet </ t i t l e >
</ head >
< body >
< h1 > Bonjour </ h1 >
< form a c t i o n =" / Hello / Servlet / Coucou " method =" post " >
< l a b e l >Pr & eacute ; nom : </ l a b e l >< i n p u t type =" text " name =" prenom " s i z e =" 30 " >
< i n p u t type =" submit " v a l u e =" envoyer " >
</ form >
< hr / >
< a d d r e s s >< a h r e f =" mailto : Thierry . Lecroq@univ - rouen . fr " > Thierry . Lecroq </ a ></ a d d r e s s >
</ body >
</ html >

Thierry Lecroq (Univ. Rouen) Servlets 8 / 69


Introduction (7/8)
Exemple de Servlet : la Servlet

Hello.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;

p u b l i c c l a s s Hello extends HttpServlet {


p u b l i c v o i d doPost ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
String prenom = requete . getParameter (" prenom " );
reponse . setContentType (" text / html ") ;
PrintWriter out = reponse . getWriter () ;
out . println (" <html >") ;
out . println (" <body >") ;
out . println (" <h1 > Bonjour " + prenom + " ! </h1 > ");
out . println (" <p > Ceci est ma premi & egrave ; re Servlet ... </ p >");
out . println (" </ body >" );
out . println (" </ html >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 9 / 69


Introduction (8/8)
Exemple de Servlet : le chier de déploiement

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app
PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN "
" file: /// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< servlet >
< servlet - name > Bonjour </ servlet - name >
< servlet - class > Hello </ servlet - class >
</ servlet >
< servlet - mapping >
< servlet - name > Bonjour </ servlet - name >
<url - pattern >/ Servlet / Coucou </ url - pattern >
</ servlet - mapping >
</ web - app >

Appel
L'appel à la Servlet se fait par : http://localhost:8080/Hello/Servlet/Coucou
Remarque : ici la Servlet ne supporte que le POST

Thierry Lecroq (Univ. Rouen) Servlets 10 / 69


API (1/13)
Application Web

Arborescence d'une archive WAR (Web ARchive)


ApplicationWeb.war
|_ fichiers.html
|_ fichiers.jsp
|_ repertoires\fichiers
|_ src
| |_ sourcesServlets.java
| |_ sourcesbibliotheques.java
|_ META-INF
| |_ MANIFEST.MF
|_ WEB-INF
|_ web.xml
|_ classes
|_ Servlets.class
|_ lib
|_ bibliotheques.jar

Thierry Lecroq (Univ. Rouen) Servlets 11 / 69


API (2/13)
Déploiement

Déploiement
le répertoire ApplicationWeb est placé dans le répertoire
d'applications du conteneur web
I webapps pour Tomcat

I JBOSS_DIR/server/JBOSS_MODE/deploy pour Jboss

ou un chier ApplicationWeb.war (chier archive web) ayant pour


contenu applicationweb :
cd ApplicationWeb ; jar cf applicationweb.war *

Thierry Lecroq (Univ. Rouen) Servlets 12 / 69


API (3/13)
Descripteur de déploiement

Fichier web.xml
Le chier web.xml contient la description du déploiement. Il doit être
valide par rapport à une DTD.
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Application web 2.3//EN"
"file:///usr/local/j2sdkee/conf/web-app_2_3.dtd">
<web-app>
<Servlet>
<Servlet-name>Alias de la Servlet</Servlet-name>
<Servlet-class>Nom de la classe Servlet</Servlet-class>
</Servlet>
<Servlet-mapping>
<Servlet-name>Alias de la Servlet</Servlet-name>
<url-pattern>chemin de l'URL déclenchant le chargement de la Servlet</url-pattern>
<!-- le joker * est autorisé dans le chemin -->
</Servlet-mapping>
</web-app>

Attention de bien respecter la DTD (ordre des balises)

Thierry Lecroq (Univ. Rouen) Servlets 13 / 69


API (4/13)
Cycle de vie

Gestion du cycle de vie des Servlets


Le conteneur Web doit se conformer à la gestion des Servlets :
I création et initialisation de Servlets
I traitement des services demandés par les éventuels clients

I destruction des Servlets et libération de l'espace mémoire

(ramasse-miettes)
Java propose une API permettant de construire des Servlets :
I l'API permet au développeur de gérer la création, les requêtes et la

destruction des Servlets


I le conteneur fait appel à cette API pour gérer les Servlets

Thierry Lecroq (Univ. Rouen) Servlets 14 / 69


API (5/13)
API : classe GenericServlet

API J2EE SDK


Nécessite l'installation du J2EE SDK
Packages : javax.Servlet.* et javax.Servlet.http.*
La classe GenericServlet :
p u b l i c abtract c l a s s GenericServlet {
GenericServlet ()
// methodes gerant l ' initialisation et la destruction
v o i d destroy ()
v o i d init ()
v o i d init ( ServletConfig config )
// methodes pour la recuperation des parametres passes
String getInitParameter ( String name )
Enumeration getInitParameterNames ()
// recuperation d ' informations concernant la Servlet
ServletConfig getServletConfig ()
ServletContext getServletContext ()
String getServletInfo ()
String getServletName ()
// ecriture de logs , pratique pour le deboguage
v o i d log ( String msg )
v o i d log ( String message , Throwable t)
// traite les requetes ( doit etre redefinie dans la sous - classe )
a b s t r a c t v o i d service ( ServletRequest req , ServletResponse res )
}

Thierry Lecroq (Univ. Rouen) Servlets 15 / 69


API (6/13)
API : classe HttpServlet
HttpServlet
p u b l i c a b s t r a c t c l a s s HttpServlet extends GenericServlet {
HttpServlet ()
// methodes repondant aux differents types de requetes
p r o t e c t e d v o i d doDelete ( HttpServletRequest req , HttpServletResponse resp )
p r o t e c t e d v o i d doGet ( HttpServletRequest req , HttpServletResponse resp )
p r o t e c t e d v o i d doHead ( HttpServletRequest req , HttpServletResponse resp )
p r o t e c t e d v o i d doOptions ( HttpServletRequest req , HttpServletResponse resp )
p r o t e c t e d v o i d doPost ( HttpServletRequest req , HttpServletResponse resp )
p r o t e c t e d v o i d doPut ( HttpServletRequest req , HttpServletResponse resp )
p r o t e c t e d v o i d doTrace ( HttpServletRequest req , HttpServletResponse resp )
// permet d ' utiliser le cache cote client
protected long getLastModified ( HttpServletRequest req )
// gerent le dispatching en fontion du type de requete
protected v o i d service ( HttpServletRequest req , HttpServetResponse resp )
v o i d service ( ServletRequest req , ServletResponse res )
}

Classe à dériver pour créer ses propres Servlets


HttpServletRequest : toutes les données de la requête
HttpServletResponse : réponse à la requête
Thierry Lecroq (Univ. Rouen) Servlets 16 / 69
API (7/13)
Servlet et Threads

Gestion des requêtes


Le conteneur WEB ne contient qu'UNE instance de chaque Servlet
Les requêtes sont traitées dans des threads :
persistance de la Servlet d'une requête à une autre,
persistance des threads,
taille mémoire réduite,
pas de surcoût pour traiter une nouvelle requête (déjà chargée),
mémoire partagée (exemple pratique : la connexion à une BD est
initialisée au chargement),
il faut gérer les problèmes de synchronisation (utilisation de l'exclusion
mutuelle).

Thierry Lecroq (Univ. Rouen) Servlets 17 / 69


API (8/13)
Exemple : Compteur simple

CompteurSimple.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s CompteurSimple extends HttpServlet {
p r i v a t e i n t compteur = 0;
p u b l i c v o i d doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
res . setContentType (" text / plain " );
PrintWriter out = res . getWriter () ;
compteur ++;
out . println (" Compteur : "+ compteur );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 18 / 69


API (9/13)
Exemple : Compteur simple

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN " " file:
/// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< servlet >
< servlet - name > CompteurSimple </ servlet - name >
< servlet - class > CompteurSimple </ servlet - class >
</ servlet >
< servlet - mapping >
< servlet - name > CompteurSimple </ servlet - name >
<url - pattern >/ Servlet / CompteurSimple </ url - pattern >
</ servlet - mapping >
</ web - app >

Thierry Lecroq (Univ. Rouen) Servlets 19 / 69


API (10/13)
Exemple : Compteur d'instances de Servlet

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN " " file:
/// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< servlet >
< servlet - name > CompteurA </ servlet - name >
< servlet - class > CompteurInstances </ servlet - class >
</ servlet >
< servlet >
< servlet - name > CompteurB </ servlet - name >
< servlet - class > CompteurInstances </ servlet - class >
</ servlet >
< servlet - mapping >
< servlet - name > CompteurA </ servlet - name >
<url - pattern >/ Servlet / CompteurA </ url - pattern >
</ servlet - mapping >
< servlet - mapping >
< servlet - name > CompteurB </ servlet - name >
<url - pattern >/ Servlet / CompteurB </ url - pattern >
</ servlet - mapping >
</ web - app >

Thierry Lecroq (Univ. Rouen) Servlets 20 / 69


API (11/13)
Compteur d'instances de Servlet
CompteurInstances.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s CompteurInstances extends HttpServlet {
p r i v a t e s t a t i c i n t nbInstances = 0;
p r i v a t e s t a t i c i n t compteurClasse = 0;
p r i v a t e i n t compteur = 0;
p u b l i c v o i d init () throws ServletException {
nbInstances ++;
}
p u b l i c v o i d destroy () {
nbInstances - -;
}
p u b l i c v o i d doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
res . setContentType (" text / plain " );
PrintWriter out = res . getWriter () ;
compteur ++;
compteurClasse ++;
out . println (" Compteur pour cette instance : "+ compteur );
out . println (" Nombre d ' instances de la servlet : "+ nbInstances );
out . println (" Compteur totale sur l ' ensemble des instances de la servlet : "+
compteurClasse ) ;
}
}

Thierry Lecroq (Univ. Rouen) Servlets 21 / 69


API (12/13)
Exemple : Compteur persistant

CompteurPersistant.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s CompteurPersistant extends HttpServlet {
p r i v a t e i n t compteur = 0;
p u b l i c v o i d init () throws ServletException {
try {
FileReader file = new FileReader ("/ tmp / compteur . txt ") ;
BufferedReader reader = new BufferedReader ( file );
compteur = Integer . parseInt ( reader . readLine () );
reader . close () ;
}
catch ( FileNotFoundException exception ) {}
catch ( IOException exception ) {}
catch ( NumberFormatException exception ) {}
}
p u b l i c v o i d destroy () {
super . destroy () ;
enregistrerEtat () ;
}

Thierry Lecroq (Univ. Rouen) Servlets 22 / 69


API (13/13)
Exemple : Compteur persistant

CompteurPersistant.java
p u b l i c v o i d doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
res . setContentType (" text / plain " );
PrintWriter out = res . getWriter () ;
compteur ++;
out . println (" Compteur : "+ compteur );
i f ( compteur % 20 == 0)
enregistrerEtat () ;
}
p u b l i c v o i d enregistrerEtat () {
try {
FileWriter file = new FileWriter ("/ tmp / compteur . txt " );
PrintWriter writer = new PrintWriter ( file ) ;
writer . println ( compteur );
writer . close () ;
}
catch ( IOException exception ) {
log ( " ErreurServlet : enregistrement de l ' etat impossible pour CompteurPersistant ");
log ( ""+ exception ) ;
}
}
}

Thierry Lecroq (Univ. Rouen) Servlets 23 / 69


Paramètres (1/13)
Paramètres d'initialisation

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN " " file:
/// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< servlet >
< servlet - name > ParamInit </ servlet - name >
< servlet - class > ParamInit </ servlet - class >
<init - param >
< param - name > parametre1 </ param - name >
< param - value > valeur1 </ param - value >
< description > test de parametre </ description >
</ init - param >
<init - param >
< param - name > parametre2 </ param - name >
< param - value > valeur2 </ param - value >
< description > test de parametre </ description >
</ init - param >
</ servlet >
< servlet - mapping >
< servlet - name > ParamInit </ servlet - name >
<url - pattern >/ Servlet / ParamInit </ url - pattern >
</ servlet - mapping >
</ web - app >

Thierry Lecroq (Univ. Rouen) Servlets 24 / 69


Paramètres (2/13)
Paramètres d'initialisation

ParamInit.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s ParamInit extends HttpServlet {
String param1 ;
String param2 ;
p u b l i c v o i d init () {
t h i s . param1 = getInitParameter (" parametre1 ");
t h i s . param2 = getInitParameter (" parametre2 ");
}
p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
reponse . setContentType (" text / plain " );
PrintWriter out = reponse . getWriter () ;
out . println (" parametre1 = " + t h i s . param1 );
out . println (" parametre2 = " + t h i s . param2 );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 25 / 69


Paramètres (3/13)
Paramètres de contexte : principe

Les paramètres de contexte


Association de paramètres à un ensemble de Servlets :
contrairement aux paramètres d'initialisation de Servlet précédents,
ceux-ci sont commun à toutes les Servlets de l'application web.
Déclaration : dans web.xml
<web - app >
< context - param >
< param - name > parametrecontext </ param - name >
< param - value > valeurcontext </ param - value >
</ context - param >
<! -- declaration des Servlets -- >
</ web - app >

Récupération dans la Servlet :


ServletContext context = getServletContext () ;
chainecontext = context . getInitParameter ( " parametrecontext ");

Thierry Lecroq (Univ. Rouen) Servlets 26 / 69


Paramètres (4/13)
Paramètres de contexte : exemple

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN " " file:
/// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< context - param >
< param - name > parametreDeContexte </ param - name >
< param - value > valeurContextuelle </ param - value >
< description > test de parametre </ description >
</ context - param >
< servlet >
< servlet - name > ParamContext </ servlet - name >
< servlet - class > ParamContext </ servlet - class >
</ servlet >
< servlet - mapping >
< servlet - name > ParamContext </ servlet - name >
<url - pattern >/ Servlet / ParamContext </ url - pattern >
</ servlet - mapping >
</ web - app >

Thierry Lecroq (Univ. Rouen) Servlets 27 / 69


Paramètres (5/13)
Paramètres de contexte : exemple

ParamContext.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s ParamContext extends HttpServlet {
p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
ServletContext context = getServletContext () ;
String chainecontext = context . getInitParameter (" parametreDeContexte " );
reponse . setContentType (" text / plain " );
PrintWriter out = reponse . getWriter () ;
out . println (" Parametre de contexte = "+ chainecontext );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 28 / 69


Paramètres (6/13)
Paramètres provenant des formulaires : principe

Récupération de paramètres en provenance d'un formulaire


Les paramètres de formulaires sont récupérables via
HttpServletRequest
La récupération se fait par les méthodes suivantes :
I Enumeration getParameterNames()
I String getParameterValues(String name)
I String getParameter(String name)

Thierry Lecroq (Univ. Rouen) Servlets 29 / 69


Paramètres (7/13)
Paramètres provenant des formulaires : exemple

Hello.java
<? xml version =" 1.0 " encoding =" iso -8859 -1 " ? >
<!DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Strict // EN " " DTD / xhtml1 - strict . dtd " >
< html xmlns =" http :// www . w3 . org /1999/ xhtml " xml : l a n g =" fr " >
< head >
< t i t l e >Ma premi & eacute ; re Servlet </ t i t l e >
</ head >
< body >
< h1 > Bonjour </ h1 >
< form a c t i o n =" / Hello / Servlet / Coucou " method =" post " >
< l a b e l >Pr & eacute ; nom : </ l a b e l >< i n p u t type =" text " name =" prenom " s i z e =" 30 " >
< i n p u t type =" submit " v a l u e =" envoyer " >
</ form >
< hr / >
< a d d r e s s >< a h r e f =" mailto : Thierry . Lecroq@univ - rouen . fr " > Thierry . Lecroq </ a ></ a d d r e s s >
</ body >
</ html >

Thierry Lecroq (Univ. Rouen) Servlets 30 / 69


Paramètres (8/13)
Paramètres provenant des formulaires : exemple

Hello.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;

p u b l i c c l a s s Hello extends HttpServlet {


p u b l i c v o i d doPost ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
String prenom = requete . getParameter (" prenom " );
reponse . setContentType (" text / html ") ;
PrintWriter out = reponse . getWriter () ;
out . println (" <html >") ;
out . println (" <body >") ;
out . println (" <h1 > Bonjour " + prenom + " ! </h1 > ");
out . println (" <p > Ceci est ma premi & egrave ; re Servlet ... </ p >");
out . println (" </ body >" );
out . println (" </ html >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 31 / 69


Paramètres (9/13)
Attributs de contexte : principe

Attributs de contexte
Partager des informations entre plusieurs Servlets :
I le partage est eectué à travers le contexte d'exécution géré par
ServletContext
Obtention du contexte d'une Servlet :
I ServletContext getServletContext(String uripath)
Manipulation d'attributs du contexte par ServletContext :
I void setAttribute(String name, Object o)
I Object getAttribute(String name)
I Enumeration getAttributeNames()
I void removeAttribute(String name)

Thierry Lecroq (Univ. Rouen) Servlets 32 / 69


Paramètres (10/13)
Attributs de contexte : exemple

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN " " file:
/// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< servlet >
< servlet - name > Increment </ servlet - name >
< servlet - class > AttributContextIncrement </ servlet - class >
</ servlet >
< servlet >
< servlet - name > Lecteur </ servlet - name >
< servlet - class > AttributContextLecteur </ servlet - class >
</ servlet >
< servlet - mapping >
< servlet - name > Increment </ servlet - name >
<url - pattern >/ Servlet / Increment </ url - pattern >
</ servlet - mapping >
< servlet - mapping >
< servlet - name > Lecteur </ servlet - name >
<url - pattern >/ Servlet / Lecteur </ url - pattern >
</ servlet - mapping >
</ web - app >

Thierry Lecroq (Univ. Rouen) Servlets 33 / 69


Paramètres (11/13)
Attributs de contexte : exemple

AttributContextLecteur.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s AttributContextLecteur extends HttpServlet {
ServletContext context ;
p u b l i c v o i d init () {
context = getServletContext () . getContext (" / AttributContext ");
}
p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
reponse . setContentType (" text / html ") ;
PrintWriter out = reponse . getWriter () ;
out . println (" <html >") ;
out . println (" <body >") ;
out . println (" <h1 > Lecteur valeur de compteur partage : "+ context . getAttribute ("
compteur ") +" </h1 > ");
out . println (" <a href = '/ AttributContext / Servlet / Increment '> incremente </ a >");
out . println (" <a href = '/ AttributContext / Servlet / Lecteur '> lecteur </a >" );
out . println (" </ form >" );
out . println (" </ body >" );
out . println (" </ html >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 34 / 69


Paramètres (12/13)
Attributs de contexte : exemple

AttributContextIncrement.java
import java . io .*;
import java . lang .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s AttributContextIncrement extends HttpServlet {
ServletContext context ;
p u b l i c v o i d init () {
context = getServletContext () . getContext (" / AttributContext ");
i f ( context . getAttribute ( " compteur " ) == n u l l )
context . setAttribute (" compteur " ,"0" );
}
p u b l i c i n t incremente () {
try {
i n t compteur = Integer . parseInt ("" + context . getAttribute (" compteur ")) +1;
context . setAttribute (" compteur " ,""+ compteur );
r e t u r n compteur ;
}
catch ( NumberFormatException exception ) {
log ( " TestAttributContext1 : probleme de conversion en int ");
log ( ""+ exception ) ;
}
r e t u r n -1;
}

Thierry Lecroq (Univ. Rouen) Servlets 35 / 69


Paramètres (13/13)
Attributs de contexte : exemple

AttributContextIncrement.java
p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
reponse . setContentType (" text / html ") ;
PrintWriter out = reponse . getWriter () ;
out . println (" <html >") ;
out . println (" <body >") ;
out . println (" <h1 > Increment valeur de compteur partage : "+ incremente () +" </h1 >") ;
out . println (" <a href = '/ AttributContext / Servlet / Increment '> incremente </ a >");
out . println (" <a href = '/ AttributContext / Servlet / Lecteur '> lecteur </a >" );
out . println (" </ form >" );
out . println (" </ body >" );
out . println (" </ html >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 36 / 69


Encodage (1/3)
Génération de texte accentué

Gestion de texte accentué


Requêtes HTTP transmises aux Servlet :
doGet(ServletRequest req, ServletResponse rep)
doPost(ServletRequest req, ServletResponse rep)
...
⇒ Toutes les entrées et sorties peuvent être (re)traitées :
ServletRequest dénit la méthode
void setCharacterEncoding(String env)
ServletResponse dénit les méthodes
I void setContentType(java.lang.String type)
I void setLocale(java.util.Locale loc)

Thierry Lecroq (Univ. Rouen) Servlets 37 / 69


Encodage (2/3)
Exemple de génération de texte accentué

Encodage.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;
p u b l i c c l a s s Encodage extends HttpServlet {
p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
reponse . setContentType (" text / plain ; charset = UTF -8 ");
reponse . setLocale ( new Locale ( Locale . FRENCH . getLanguage () , Locale . FRANCE . getCountry () )
);
PrintWriter out = reponse . getWriter () ;

out.println("Texte accentué : àéèùöùï") ;


}
}

Thierry Lecroq (Univ. Rouen) Servlets 38 / 69


Encodage (3/3)
Traitement de requêtes contenant des accents

CodageGet.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;

p u b l i c c l a s s CodageGet extends HttpServlet {


p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
reponse . setContentType (" text / plain ; charset = UTF -8 ");
reponse . setLocale ( new Locale ( Locale . FRENCH . getLanguage () , Locale . FRANCE . getCountry () )
);
PrintWriter out = reponse . getWriter () ;
String texte = requete . getParameter (" texte ");
requete . setCharacterEncoding (" UTF -8 ");
texte = requete . getParameter (" texte ") ;
out . println (" Texte apres traitement : " + texte );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 39 / 69


Filtrage (1/8)
Principes du ltrage

Principes du ltrage
Application de ltres :
Iaux requêtes faites aux servlets
Iaux réponses de servlets
Objectif : modier leur entête et/ou leur contenu
Utilisation :
I authentication,
I conversion (ex : formats d'image),
I journalisation (ex : ajout de date),
I transformations XML,
I ...

Thierry Lecroq (Univ. Rouen) Servlets 40 / 69


Filtrage (2/8)
Mise en ÷uvre

Implémentation de l'interface Filter


Trois méthodes à redénir :
I void init(FilterConfig) : permet de récupérer des informations sur le
ltre mais aussi sur la servlet via le context
I void destroy() : pour libérer des ressources à la destruction
I void doFilter(ServletRequest req, ServletResponse, filterChain
chain) :
F examiner la requête et/ou la réponse (entête et corps)
F modier la requête et/ou la réponse (entête et corps)
F appeller les autres ltres

Les ltres sont appellés dans l'ordre de déclaration dans web.xml

Thierry Lecroq (Univ. Rouen) Servlets 41 / 69


Filtrage (3/8)
Exemple : ltre d'entête

FiltreEntete.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;
p u b l i c c l a s s FiltreEntete implements Filter {
p u b l i c v o i d init ( FilterConfig fconfig ) {}
p u b l i c v o i d destroy () {}
p u b l i c v o i d doFilter ( ServletRequest requete , ServletResponse reponse , FilterChain chain
)
throws ServletException , IOException {
reponse . setContentType (" text / plain ; charset = UTF -8 ");
reponse . setLocale ( new Locale ( Locale . FRENCH . getLanguage () , Locale . FRANCE . getCountry () )
);
PrintWriter writer = reponse . getWriter () ;
writer . println (" Entete ajoute par le filtre : FiltreEntete ");
chain . doFilter ( requete , reponse );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 42 / 69


Filtrage (4/8)
Exemple : ltre de pied de page

FiltrePied.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;
p u b l i c c l a s s FiltrePied implements Filter {
p u b l i c v o i d init ( FilterConfig fconfig ) {}
p u b l i c v o i d destroy () {}
p u b l i c v o i d doFilter ( ServletRequest requete , ServletResponse reponse , FilterChain chain
)
throws ServletException , IOException {
reponse . setContentType (" text / plain ; charset = UTF -8 ");
reponse . setLocale ( new Locale ( Locale . FRENCH . getLanguage () , Locale . FRANCE . getCountry () )
);
chain . doFilter ( requete , reponse );
PrintWriter writer = reponse . getWriter () ;
writer . println (" Pied de page ajoute par le filtre : FiltrePied ");
}
}

Thierry Lecroq (Univ. Rouen) Servlets 43 / 69


Filtrage (5/8)
Exemple : ltre dans les log

FiltreLogTime.java
import java . io .*;
import java . text .*;
import java . util .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s FiltreLogTime implements Filter {
p r i v a t e SimpleDateFormat formatter = new SimpleDateFormat ("E d MMM yyyy , H:m :s. S" ,
Locale . FRANCE );
p r i v a t e Date date = new Date () ;
p r i v a t e FilterConfig fconfig ;
p u b l i c v o i d init ( FilterConfig fconfig ) {
t h i s . fconfig = fconfig ;
}
p u b l i c v o i d doFilter ( ServletRequest requete , ServletResponse reponse , FilterChain chain
) throws ServletException , IOException {
ServletContext context = t h i s . fconfig . getServletContext () ;
HttpServletRequest httpRequete = ( HttpServletRequest ) requete ;
t h i s . date . setTime ( System . currentTimeMillis () );
context . log ( " Debut : "+ formatter . format ( t h i s . date ) +" > " + httpRequete . getRequestURL () );
chain . doFilter ( requete , reponse );
t h i s . date . setTime ( System . currentTimeMillis () );
context . log ( " Fin : "+ formatter . format ( t h i s . date ) +" > " + httpRequete . getRequestURL () );
}

Thierry Lecroq (Univ. Rouen) Servlets 44 / 69


Filtrage (6/8)
Exemple : Servlet traitée
FiltreLogTime.java
p u b l i c v o i d destroy () {
t h i s . formatter = n u l l ;
t h i s . date = null ;
t h i s . fconfig = null ;
}
}

Compteur.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s Compteur extends HttpServlet {
p r i v a t e i n t compteur = 0;
p u b l i c v o i d doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
PrintWriter out = res . getWriter () ;
compteur ++;
out . println (" Compteur : "+ compteur );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 45 / 69


Filtrage (7/8)
Exemple : déploiement

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN " " file:
/// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< filter >
< filter - name > FiltreLogTime </ filter - name >
< filter - class > FiltreLogTime </ filter - class >
</ filter >
< filter >
< filter - name > FiltreEntete </ filter - name >
< filter - class > FiltreEntete </ filter - class >
</ filter >
< filter >
< filter - name > FiltrePied </ filter - name >
< filter - class > FiltrePied </ filter - class >
</ filter >
< filter - mapping >
< filter - name > FiltreLogTime </ filter - name >
<url - pattern >/* </ url - pattern >
</ filter - mapping >
< filter - mapping >
< filter - name > FiltreEntete </ filter - name >
< servlet - name > Compteur </ servlet - name >
</ filter - mapping >

Thierry Lecroq (Univ. Rouen) Servlets 46 / 69


Filtrage (8/8)
Exemple : déploiement

web.xml
< filter - mapping >
< filter - name > FiltrePied </ filter - name >
< servlet - name > Compteur </ servlet - name >
</ filter - mapping >
< servlet >
< servlet - name > Hello </ servlet - name >
< servlet - class > Hello </ servlet - class >
</ servlet >
< servlet >
< servlet - name > Compteur </ servlet - name >
< servlet - class > Compteur </ servlet - class >
</ servlet >
< servlet - mapping >
< servlet - name > Hello </ servlet - name >
<url - pattern >/ Servlet / Hello </ url - pattern >
</ servlet - mapping >
< servlet - mapping >
< servlet - name > Compteur </ servlet - name >
<url - pattern >/ Servlet / Compteur </ url - pattern >
</ servlet - mapping >
</ web - app >

Thierry Lecroq (Univ. Rouen) Servlets 47 / 69


Partage du contrôle (1/8)
Principe d'invocation

Appel d'une ressource à partir d'une autre Servlet


Deux types d'invocations possibles :
I l'inclusion
I la délégation

L'interface ServletRequest met à disposition un distributeur de


requête par URL absolue ou relative :
RequestDispatcher getRequestDispatcher(String path)
L'interface ServletContext met à disposition un distributeur de
requête par nom au lieu d'une URL :
RequestDispatcher getNamedDispatcher(String name)

Thierry Lecroq (Univ. Rouen) Servlets 48 / 69


Partage du contrôle (2/8)
RequestDispatcher

Deux méthodes importantes


Il y a transmission des objets requête et réponse
void forward(ServletRequest req, ServletResponse rep) :
délègue totalement à la ressource appelée, la réponse sera celle de la
ressource
void include(ServletRequest req, ServletResponse rep) :
invoque et inclut la réponse de la ressource à la réponse de la servlet
Il est possible d'ajouter de nouveaux attributs à la requête

Thierry Lecroq (Univ. Rouen) Servlets 49 / 69


Partage du contrôle (3/8)
Délégation

Ache.java
import java . io .*;
import java . util .*;
import javax . servlet .*;
import javax . servlet . http .*;

p u b l i c c l a s s Affiche extends HttpServlet {


p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse )
throws ServletException , IOException {
reponse . setContentType (" text / html ; charset = UTF -8 ");
PrintWriter out = reponse . getWriter () ;
out . println (" <html >") ;
out . println (" <head >") ;
out . println (" < title > Exemple de delegation </ title >") ;
out . println (" </ head >" );
out . println (" <body >") ;
out . println (" <p > <b > Nombre d ' espaces : </b >" + requete . getAttribute (" resultat ") +" </p >" )
;
out . println (" <p ><b > Phrase : </b >\" "+ requete . getParameter (" phrase ")+" \" </p > ");
out . println (" </ body >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 50 / 69


Partage du contrôle (4/8)
Délégation

AnalyseTexte.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s AnalyseTexte extends HttpServlet {
p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse ) throws
ServletException , IOException {
String phrase = requete . getParameter (" phrase " );
String url ;
i f ( phrase != n u l l && ! phrase . trim () . equals ("") )
url = " / Servlet / Affiche " ;
else
url = " / delegation . html " ;
requete . setAttribute (" resultat " , "" + calculNbMotif (" " , phrase ) );
RequestDispatcher rd = requete . getRequestDispatcher ( url ) ;
rd . forward ( requete , reponse );
}

Thierry Lecroq (Univ. Rouen) Servlets 51 / 69


Partage du contrôle (5/8)
Délégation

AnalyseTexte.java
i n t calculNbMotif ( String motif , String phrase ) {
i n t nbMotifs = 0;
i n t indice = 0;
w h i l e (( indice = phrase . indexOf ( motif , indice )) != -1) {
nbMotifs ++;
indice ++;
}
r e t u r n nbMotifs ;
}
}

Utilité
Couramment utilisée pour déléguer l'achage, le traitement étant fait dans
la première servlet. Le résultat est transmis à une autre servlet via des
attributs puis est aché.

Thierry Lecroq (Univ. Rouen) Servlets 52 / 69


Partage du contrôle (6/8)
Inclusion

Ache.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;

p u b l i c c l a s s Affiche extends HttpServlet {


p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse )
throws ServletException , IOException {
requete . setCharacterEncoding (" ISO -8859 -1 ") ;
String phrase = requete . getParameter (" phrase " );
String caracteres = requete . getParameter (" caracteres ");
i f ( phrase == n u l l || phrase . trim () . equals ( "")) {
RequestDispatcher rd = requete . getRequestDispatcher (" / inclusion . html ") ;
rd . forward ( requete , reponse );
return ;
}
reponse . setContentType (" text / html ; charset = ISO -8859 -1 ") ;
reponse . setLocale ( new Locale ( Locale . FRENCH . getLanguage () , Locale . FRANCE . getCountry () )
);
PrintWriter out = reponse . getWriter () ;
out . println (" <html >") ;
out . println (" <head >") ;
out . println (" < title > Exemple d ' inclusion </ title >") ;
out . println (" </ head >" );
out . println (" <body >") ;

Thierry Lecroq (Univ. Rouen) Servlets 53 / 69


Partage du contrôle (7/8)
Inclusion

Ache.java
out . println (" <p ><b > Phrase : </b >\" "+ requete . getParameter (" phrase ")+ " \" </ p >");
f o r ( i n t i =0; i < caracteres . length () ; i ++) {
requete . setAttribute (" motif " , "" + caracteres . charAt (i ));
RequestDispatcher rd = requete . getRequestDispatcher (" / Servlet / Analyse " );
out . println (" <p > <b > Nombre de \" "+ caracteres . charAt (i )+" \" : </b >") ;
rd . include ( requete , reponse );
out . println (" </p > ");
}
out . println (" </ body >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 54 / 69


Partage du contrôle (8/8)
Inclusion

AnalyseTexte.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;

p u b l i c c l a s s AnalyseTexte extends HttpServlet {


p u b l i c v o i d doGet ( HttpServletRequest requete , HttpServletResponse reponse )
throws ServletException , IOException {
String phrase = requete . getParameter (" phrase ") ;
String motif = ( String ) requete . getAttribute (" motif ") ;
PrintWriter out = reponse . getWriter () ;
out . println ( calculNbMotif ( motif , phrase ));
}
i n t calculNbMotif ( String motif , String phrase ) {
i n t nbMotifs = 0;
i n t indice = 0;
w h i l e (( indice = phrase . indexOf ( motif , indice )) != -1) {
nbMotifs ++;
indice ++;
}
r e t u r n nbMotifs ;
}
}

Thierry Lecroq (Univ. Rouen) Servlets 55 / 69


Session (1/4)
API de suivi de session

Chaque session d'un client est gérée via un objet HttpSession


Récupération d'une session par HttpServletRequest :
I HttpSession getSession()
Quelques méthodes de HttpSession :
I void setAttribute(String name, Object value)
I void getAttribute(String name)
I void removeAttribute(String name)
I void setMaxInactiveInterval(int secs)
I void invalidate()

Thierry Lecroq (Univ. Rouen) Servlets 56 / 69


Session (2/4)
Exemple : Compteur & Session

Timeout
<web - app >
...
< session - config >
< session - timeout >10 </ session - timeout >
<! -- temps en minutes -- >
</ session - config >
...
</ web - app >

CompteurSession.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;
p u b l i c c l a s s CompteurSession extends HttpServlet {
p r i v a t e s t a t i c i n t compteur = 1;
p u b l i c v o i d doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
String message = " Vous êtes éàdj venu ";
HttpSession session = req . getSession () ;

Thierry Lecroq (Univ. Rouen) Servlets 57 / 69


Session (3/4)
Exemple : Compteur & Session

CompteurSession.java
êéà
i f ( session . getAttribute ( " DejaVenu " ) == n u l l ) {
session . setAttribute (" DejaVenu " ," dejavenu " );
message = " Bienvenue " ;
compteur ++;
}
res . setContentType (" text / html ; charset = UTF -8 ");
res . setLocale ( new Locale ( Locale . FRENCH . getLanguage () , Locale . FRANCE . getCountry () ));
PrintWriter out = res . getWriter () ;
out . println (" <head >") ;
out . println (" < title > Compteur à Session </ title > ");
out . println (" </ head >" );
out . println (" <body >") ;
out . println (" <h1 >" + compteur + " </ h1 > ");
out . println (" <h1 >" + message +" </h1 >" );
out . println (" <a href = ' CompteurKiller '> The Session killer </a >" );
out . println (" </ body >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 58 / 69


Session (4/4)
Compteur & Session

CompteurSessionKiller.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;
p u b l i c c l a s s CompteurSessionKiller extends HttpServlet {
p u b l i c v o i d doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
String message = " Vous n ' avez pas de session en cours ";
HttpSession session = req . getSession () ;
i f ( session . getAttribute (" DejaVenu ") != n u l l ) {
message = "C ' est la morte session :) " ;
session . invalidate () ;
}
res . setContentType (" text / html charset = UTF -8 " );
res . setLocale ( new Locale ( Locale . FRENCH . getLanguage () , Locale . FRANCE . getCountry () ));
PrintWriter out = res . getWriter () ;
out . println (" <head >") ;
out . println (" < title > Compteur à Session </ title > ");
out . println (" </ head >" );
out . println (" <body >") ;
out . println (" <h1 >" + message +" </h1 >" );
out . println (" <a href = ' Compteur '> Le retour du compteur !!! </ a >");
out . println (" </ body >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 59 / 69


Authentication (1/10)
Méthodes d'authentication

2 méthodes d'identication
Utilisation des mécanismes d'authentication du serveur
La gestion des comptes et mots de passe dépend du serveur
d'applications (pour Tomcat gestion des comptes dans
conf/tomcat-users.xml)
Authentication personnalisée gérée par des servlets
La gestion des comptes et mots de passe est laissée au développeur
Problème principal : mots de passe en clair
Solution : crypter le canal de communication (HTTPS)

Thierry Lecroq (Univ. Rouen) Servlets 60 / 69


Authentication (2/10)
Authentication par le serveur

information.html
<? xml version =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Strict // EN " " DTD / xhtml1 - strict . dtd " >
< html >
< head >
< t i t l e > Information secrete </ t i t l e >
</ head >
< body >
< a h r e f =" Servlet / InformationSecrete " > Lien vers une information secrete ... </ a >< br / >
< hr / >
</ body >
</ html >

Pour Tomcat : tomcat-users.xml dans conf


<? xml v e r s i o n = ' 1.0 ' encoding = 'utf -8 '? >
< tomcat - users >
< role rolename =" prof " / >
< role rolename =" etudiant "/ >
< user username =" lecroq " password =" lecroq " roles = " prof " / >
< user username =" anonyme " password = " anonyme " roles =" etudiant "/ >
< user username =" tt " password =" tt " roles =" etudiant "/ >
</ tomcat - users >

Thierry Lecroq (Univ. Rouen) Servlets 61 / 69


Authentication (3/10)
Authentication par le serveur

InformationSecrete.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s InformationSecrete extends HttpServlet {
p u b l i c v o i d doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
res . setContentType (" text / html ; charset = ISO -8859 -1 ") ;
PrintWriter out = res . getWriter () ;
out . println (" <html >") ;
out . println (" <head >") ;
out . println (" < title > Information Secrete </ title >" );
out . println (" </ head >" );
out . println (" <body >") ;
out . println (" <h1 > Contrepetrie belge </ h1 >" );
out . println (" <p > \" Il fait beau et chaud .\" </p >") ;
out . println (" </ body >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 62 / 69


Authentication (4/10)
Authentication par le serveur : web.xml

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN " " file:
/// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< servlet >
< servlet - name > InformationSecrete </ servlet - name >
< servlet - class > InformationSecrete </ servlet - class >
</ servlet >
< servlet - mapping >
< servlet - name > InformationSecrete </ servlet - name >
<url - pattern >/ Servlet / InformationSecrete </ url - pattern >
</ servlet - mapping >

Thierry Lecroq (Univ. Rouen) Servlets 63 / 69


Authentication (5/10)
Authentication par le serveur : web.xml

web.xml
< security - constraint >
<web - resource - collection >
<web - resource - name > Contrepetrie </ web - resource - name >
<url - pattern >/ Servlet / InformationSecrete </ url - pattern >
<http - method > GET </ http - method >
<http - method > POST </ http - method >
</ web - resource - collection >
<auth - constraint >
<role - name > prof </ role - name >
</ auth - constraint >
</ security - constraint >
< login - config >
<auth - method > BASIC </ auth - method >
< realm - name > Contrepetrie </ realm - name >
</ login - config >
< security - role >
<role - name > prof </ role - name >
</ security - role >
</ web - app >

Thierry Lecroq (Univ. Rouen) Servlets 64 / 69


Authentication (6/10)
Authentication par formulaire

Pour Tomcat : tomcat-users.xml dans conf


<? xml v e r s i o n = ' 1.0 ' encoding = 'utf -8 '? >
< tomcat - users >
< role rolename =" prof " / >
< role rolename =" etudiant "/ >
< user username =" lecroq " password =" lecroq " roles = " prof " / >
< user username =" anonyme " password = " anonyme " roles =" etudiant "/ >
< user username =" tt " password =" tt " roles =" etudiant "/ >
</ tomcat - users >

information.html
<? xml version =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Strict // EN " " DTD / xhtml1 - strict . dtd " >
< html >
< head >
< t i t l e > Information secrete </ t i t l e >
</ head >
< body >
< hr >
< a h r e f =" Servlet / InformationSecrete " > Lien vers l ' information secrete ... </ a >< br >
< hr >
</ body >
</ html >

Thierry Lecroq (Univ. Rouen) Servlets 65 / 69


Authentication (7/10)
Authentication par formulaire

InformationSecrete.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
p u b l i c c l a s s InformationSecrete extends HttpServlet {
p u b l i c v o i d doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
res . setContentType (" text / html ") ;
PrintWriter out = res . getWriter () ;
out . println (" <html >") ;
out . println (" <head >") ;
out . println (" < title > Information secrete </ title >" );
out . println (" </ head >" );
out . println (" <body >") ;
out . println (" <h1 > Contrepetrie </ h1 > ");
out . println (" <p >\" Je glisse dans la piscine \" </p >") ;
out . println (" </ body >" );
}
}

Thierry Lecroq (Univ. Rouen) Servlets 66 / 69


Authentication (8/10)
Authentication par formulaire

web.xml
<? xml v e r s i o n =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD Application web 2.3// EN " " file:
/// opt / j2sdkee / conf / web - app_2_3 . dtd " >
<web - app >
< servlet >
< servlet - name > InformationSecrete </ servlet - name >
< servlet - class > InformationSecrete </ servlet - class >
</ servlet >
< servlet - mapping >
< servlet - name > InformationSecrete </ servlet - name >
<url - pattern >/ Servlet / InformationSecrete </ url - pattern >
</ servlet - mapping >
< security - constraint >
<web - resource - collection >
<web - resource - name > Contrepetrie </ web - resource - name >
<url - pattern >/ Servlet / InformationSecrete </ url - pattern >
<http - method > GET </ http - method >
<http - method > POST </ http - method >
</ web - resource - collection >
<auth - constraint >
<role - name > prof </ role - name >
</ auth - constraint >
</ security - constraint >

Thierry Lecroq (Univ. Rouen) Servlets 67 / 69


Authentication (9/10)
Authentication par formulaire

web.xml
< login - config >
<auth - method > FORM </ auth - method >
<form - login - config >
<form - login - page >/ login . html </ form - login - page >
<form - error - page >/ erreur . html </ form - error - page >
</ form - login - config >
</ login - config >
< security - role >
<role - name > prof </ role - name >
</ security - role >
</ web - app >

erreur.html
<? xml version =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Strict // EN " " DTD / xhtml1 - strict . dtd " >
< html >
< head >< t i t l e > Authentification par formulaire </ t i t l e ></ head >
< body >
< hr >< h1 > Erreur d ' authentification </ h1 >< hr >
</ body >
</ html >

Thierry Lecroq (Univ. Rouen) Servlets 68 / 69


Authentication (10/10)
Authentication par formulaire

login.html
<? xml version =" 1.0 " encoding =" ISO -8859 -1 " ? >
<!DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Strict // EN " " DTD / xhtml1 - strict . dtd " >
< html >
< head >
< t i t l e > Authentification par formulaire </ t i t l e >
</ head >
< body >
< hr >< form a c t i o n =" j_security_check " method =" post " >
Login : < i n p u t type =" text " name =" j_username " >< br / >
Pass : < i n p u t type =" password " name =" j_password " >< br / >
< i n p u t type =" submit " >
</ form >< hr / >
</ body >
</ html >

Thierry Lecroq (Univ. Rouen) Servlets 69 / 69

Vous aimerez peut-être aussi