Les Servlets

Transcription

Les Servlets
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
long getLastModified ( HttpServletRequest req )
protected
// gerent le dispatching en fontion du type de requete
v o i d service ( HttpServletRequest req , HttpServetResponse resp )
v o i d service ( ServletRequest req , ServletResponse res )
protected
}
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 "
/// 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
" file:
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 "
/// 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
" file:
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
I
I
Enumeration getParameterNames()
String getParameterValues(String name)
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
I
I
I
void setAttribute(String name, Object o)
Object getAttribute(String name)
Enumeration getAttributeNames()
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
import
import
import
java . io .*;
java . lang .*;
javax . servlet .*;
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
I
void setContentType(java.lang.String type)
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
import
import
import
java . io .*;
javax . servlet .*;
javax . servlet . http .*;
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
import
import
import
java . io .*;
javax . servlet .*;
javax . servlet . http .*;
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 :
aux requêtes faites aux servlets
aux réponses de servlets
Objectif : modier leur entête et/ou leur contenu
I
I
Utilisation :
I
I
I
I
I
authentication,
conversion (ex : formats d'image),
journalisation (ex : ajout de date),
transformations XML,
...
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
I
I
: permet de récupérer des informations sur le
ltre mais aussi sur la servlet via le context
void destroy() : pour libérer des ressources à la destruction
void init(FilterConfig)
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
import
import
import
java . io .*;
javax . servlet .*;
javax . servlet . http .*;
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
import
import
import
java . io .*;
javax . servlet .*;
javax . servlet . http .*;
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
import
import
import
import
java . io .*;
java . text .*;
java . util .*;
javax . servlet .*;
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
import
import
import
java . io .*;
java . util .*;
javax . servlet .*;
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
import
import
import
java . io .*;
javax . servlet .*;
javax . servlet . http .*;
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
I
I
I
I
void
void
void
void
void
setAttribute(String name, Object value)
getAttribute(String name)
removeAttribute(String name)
setMaxInactiveInterval(int secs)
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
import
import
import
java . io .*;
javax . servlet .*;
javax . servlet . http .*;
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
import
import
import
java . io .*;
javax . servlet .*;
javax . servlet . http .*;
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