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