Académique Documents
Professionnel Documents
Culture Documents
Thierry Lecroq
(merci à Alexandre Pauchet (INSA Rouen))
Université de Rouen
FRANCE
1 Introduction
2 API
3 Paramètres
4 Encodage
5 Filtrage
6 Partage du contrôle
7 Session
8 Authentication
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 >
Hello.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
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
Déploiement
le répertoire ApplicationWeb est placé dans le répertoire
d'applications du conteneur web
I webapps pour Tomcat
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>
(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
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 );
}
}
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 >
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 >
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 () ;
}
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 ) ;
}
}
}
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 >
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 );
}
}
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 >
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 );
}
}
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 >
Hello.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
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)
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 >
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 >" );
}
}
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;
}
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 >" );
}
}
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 () ;
CodageGet.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;
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 ...
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 );
}
}
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 ");
}
}
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 () );
}
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 );
}
}
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 >
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 >
Ache.java
import java . io .*;
import java . util .*;
import javax . servlet .*;
import javax . servlet . http .*;
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 );
}
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é.
Ache.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
import java . util . Locale ;
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 >" );
}
}
AnalyseTexte.java
import java . io .*;
import javax . servlet .*;
import javax . servlet . http .*;
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 () ;
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 >" );
}
}
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 >" );
}
}
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)
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 >
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 >" );
}
}
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 >
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 >
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 >
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 >" );
}
}
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 >
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 >
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 >