Sie sind auf Seite 1von 82

Organisation du cours sur les Servlets

 Servlets et API

 Traitement des donnes de formulaires

 Architecture de dveloppement

 Cycle de vie

 Suivi de session

 Collaboration de Servlets
keulkeul.blogspot.com

 Scurit : authentification

 Accs aux BD avec JDBC


Servlets - M. Baron - Page 38
Quest ce quune Servlet

 Composant logiciel crit en Java fonctionnant du cot serveur


 Au mme titre nous trouvons
 CGI (Common Gateway Interface)
 Langages de script cot serveur PHP, ASP (Active Server Pages)

 Permet de grer des requtes HTTP et de fournir au client


une rponse HTTP
 Une Servlet sexcute dans un moteur de Servlet ou
conteneur de Servlet permettant dtablir le lien entre la
keulkeul.blogspot.com

Servlet et le serveur Web


 Une Servlet sexcute par l'intermdiaire d'une machine
virtuelle Servlets - M. Baron - Page 39
Architecture Servlets

Processus principal
Rponse HTTP
Requte HTTP
Conteneur de Servlets

Servlet 1

Servlet 2

Client WEB
Servlet 3

Serveur Machine virtuelle Java


Web

Thread
keulkeul.blogspot.com

Les Servlets peuvent tre toutes


gres par des thread spars au
sein dun mme processus de
machine virtuelle
Servlets - M. Baron - Page 40
Ok, mais quoi a sert ?

 Crer des pages HTML dynamiques, gnrer des images, ...


 Effectuer des tches de type CGI qui sont des traitements
applicatifs cot serveur WEB
 Manipulation dune base de donnes
 Gestion dun systme de surveillance, ...

 Respecter les principes dune architecture : crire une


application en Java dont linterface utilisateur est dans le
client
keulkeul.blogspot.com

 Applet (SWING)
 Tlphone portable (WAP)
 Navigateur (HTML)
Servlets - M. Baron - Page 41
Puissance des Servlets

 Portabilit
 Technologie indpendante de la plate-forme et du serveur
 Un langage (Java) et plusieurs plate-forme (.NET plusieurs langages
et une plate-forme)
 Puissance
 Disponibilit de lAPI de Java
 Manipulation dimages, connectivit aux bases de donnes (JDBC),
 Efficacit et endurance
 Une Servlet est charge une seule fois (CGI charge puis dcharge
aprs utilisation)
keulkeul.blogspot.com

 Une Servlet conserve son tat (connexions des bases de donnes)


 Sret
 Typage fort de Java
 Gestion des erreurs par exception Servlets - M. Baron - Page 42
Premire Servlet : HelloWorld

Ne pas oublier d'importer la HelloWorld est un objet Redfinition de la mthode


bibliothque Java des Servlets de type HttpServlet doGet (traitement d'une
requte GET)
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
res.setContentType("text/hrml");
PrintWriter out = res.getWriter();

out.println("<HTML>");
out.println("<HEAD><TITLE>Bonjour tout le monde</TITLE></HEAD>");
out.println("<BODY>");
out.println("<BIG>Bonjour tout le monde</BIG>");
keulkeul.blogspot.com

out.println("</BODY></HTML>");
}
}

Rponse sous HelloWorld.java du


projet
format HTML
HelloWorldServlet
Le rsultat sur le client Servlets - M. Baron - Page 43
L'API Servlet : du gnrique l'HTTP

 Une Servlet doit implmenter l'interface javax.servlet.Servlet


et javax.servlet.ServletConfig

Servlet << Interface >> ServletConfig << Interface >>


+ init() + getInitParameter(String) : String
+ service() + getServletName() : String
+ destroy() + ...

 Plus simplement l'API Servlet fournit deux classes qui pro-


posent dj une implmentation
keulkeul.blogspot.com

 GenericServlet : pour la conception de Servlets indpendantes du


protocole

 HttpServlet : pour la conception de Servlets spcifiques au


protocole HTTP Servlets - M. Baron - Page 44
L'API Servlet : du gnrique l'HTTP

Servlet << Interface >> ServletConfig << Interface >>


+ init() + getInitParameter(String) : String
+ service() + getServletName() : String
+ destroy() + ...

tendre cette classe GenericServlet {abstraite}


pour construire des + service(...) {abstraite}
Servlets "gnriques"
+ ...
keulkeul.blogspot.com

tendre cette classe HttpServlet


pour construire des + service()
Servlets propre au + doXXX ()
protocole HTTP

Servlets - M. Baron - Page 45


L'API Servlet : la classe GenericServlet

 Une Servlet qui hrite GenericServlet {abstraite}

de GenericServlet est une Servlet + service() {abstraite}


+ ...
indpendante du protocole
 Obligation d'implmenter la mthode service() qui reste le
principal point d'entre du client vers le serveur
 Besoin de vrifier explicitement le type de protocole

requte
keulkeul.blogspot.com

service(...)

rponse

Serveur Web Conteneur de Servlets :


sous-classe de GenericServlet

Servlets - M. Baron - Page 46


L'API Servlet : la classe HttpServlet

 Dans la suite du cours nous allons utiliser uniquement des


Servlets qui ragissent au protocole HTTP d'o l'utilisation de
la classe HttpServlet
 HttpServlet redfinit la mthode service()
 service() lit la mthode (GET, POST, ) partir de la requte
 Elle transmet la requte une mthode approprie de HttpServlet
destine traiter le type de requte (GET, POST, )

rponse
requte GET doGet(...)
keulkeul.blogspot.com

service(...)

rponse doPost(...)
requte POST

Serveur Web Conteneur de Servlets : sous-classe de HttpServlet

Servlets - M. Baron - Page 47


HttpServlet : mthodes de traitement de requtes

 Plusieurs mthodes sont fournies pour traiter les diffrents


types de requtes (GET, POST, ).
 Elles sont appeles mthodes de traitement de requtes
 Elles ont un en-tte identique doXXX() o XXX correspond
au type de requte
 doPost() est la mthode pour traiter les requtes de type POST
 doGet() est la mthode pour traiter les requtes de type GET
 doHead(), doTrace(),

 Selon le type de requte (GET ou POST) le concepteur


keulkeul.blogspot.com

redfinit la mthode concerne


Pour les besoins du cours nous
utiliserons essentiellement les
mthodes doPost() et doGet()
Servlets - M. Baron - Page 48
HttpServlet : mthodes de traitement de requtes

 L'implmentation par dfaut des mthodes doXXX() renvoie


une erreur de type HTTP 405 Appel du code doGet()
 Type de requte non support par l'URL de la super-classe
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorldError extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
super.doGet(req, res);
}
}

HelloWorldError.java
du projet
keulkeul.blogspot.com

HelloWorldServlet

Ne vous trompez pas de


mthode redfinir selon
le type de requte Servlets - M. Baron - Page 49
HttpServlet : requte et rponse

 La mthode service() et par consquent les mthodes de


traitement de requtes (ex : doPost()) sont appeles
 un objet requte

 un objet rponse Objet de requte Objet de rponse


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SampleServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
...
}
keulkeul.blogspot.com

public void doPost(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
...
}
}

Servlets - M. Baron - Page 50


HttpServlet : objet requte HttpServletRequest

 HttpServletRequest hrite de ServletRequest


 Cet objet encapsule la requte HTTP et fournit des mthodes
pour accder aux informations
 du client
 de l'environnement du serveur
 Exemples de mthodes
 String getMethod() : retourne le type de requte
 String getServeurName() : retourne le nom du serveur
 String getParameter(String name) : retourne la valeur d'un paramtre
 String[] getParameterNames() : retourne le nom des les paramtres
keulkeul.blogspot.com

 String getRemoteHost() : retourne l'IP du client


 String getServerPort() : retourne le port sur lequel le serveur coute
 String getQueryString() : retourne la chane dinterrogation
 (voir l'API Servlets pour le reste) Servlets - M. Baron - Page 51
HttpServlet : objet requte HttpServletRequest

 Exemple : Servlet qui affiche un certains nombre d'informa-


tions issues de HttpServletRequest
public class InfosServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out= response.getWriter();
out.println("Protocol: " + request.getProtocol());
out.println("Scheme: " + request.getScheme());
out.println("ServerName: " + request.getServerName());
out.println("ServerPort: " + request.getServerPort());
out.println("RemoteAddr: " + request.getRemoteAddr());
out.println("RemoteHost: " + request.getRemoteHost());
out.println("Method: " + request.getMethod());
...
}}
keulkeul.blogspot.com

InfosServlet.java du
projet InfosServlet

Servlets - M. Baron - Page 52


HttpServlet : objet rponse HttpServletResponse

 HttpServletResponse hrite de ServletResponse


 Cet objet est utilis pour construire un message de rponse
HTTP renvoy au client, il contient
 les mthodes ncessaires pour dfinir le type de contenu, en-tte et
code de retour
 un flot de sortie pour envoyer des donnes (par exemple HTML) au
client

 Exemples de mthodes
 void setStatus(int) : dfinit le code de retour de la rponse
keulkeul.blogspot.com

 void setContentType(String) : dfinit le type de contenu MIME


 ServletOutputStream getOutputStream() : flot pour envoyer des
donnes binaires au client
 void sendRedirect(String) : redirige le navigateurServlets
vers l'URL
- M. Baron - Page 53
HttpServlet : objet rponse HttpServletResponse

 Exemple 1 : crit un message de type TEXT au client


 Utilisation de la mthode PrintWriter getWriter()
public class HelloWorldPrintWriter extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
res.setContentType("text/plain");

PrintWriter out = res.getWriter();

out.println("Premier Message");
out.println("Coucou voil comment crire un message");
out.println("Second Message");
}
}
keulkeul.blogspot.com

HelloWorldPrintWriter.java
du projet HelloWorld

Servlets - M. Baron - Page 54


HttpServlet : objet rponse HttpServletResponse

 Exemple 2 : effectue une re-direction vers un site web


 Utilisation de la mthode sendRedirect(String)
public class SendRedirect extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.sendRedirect("http://www.google.fr");
}}

SendRedirect.java du
projet HelloWorld
keulkeul.blogspot.com

Servlets - M. Baron - Page 55


HttpServlet : objet rponse HttpServletResponse

 Exemple 3 : effectue un tlchargement de fichier sur le


client
public class DownloadFileServlet extends HttpServlet {
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
Le fichier tlcharger se
try { trouve sur le serveur
InputStream is = new FileInputStream("c:/dd.txt");
OutputStream os = arg1.getOutputStream();
Flux de sortie = client
arg1.setContentType("text/plain");
arg1.setHeader("Content-Disposition","attachment;filename=toto.txt");

int count;
byte buf[] = new byte[4096];
while ((count = is.read(buf)) > -1)
os.write(buf, 0, count);
keulkeul.blogspot.com

is.close();
os.close(); En-tte de la rponse
} catch (Exception e) { adapte pour retourner
// Y a un problme. un fichier
}
} DownloadFileServlet.java du
} projet DownloadFileServlet

Servlets - M. Baron - Page 56


HttpServlet : objet rponse HttpServletResponse

 Exemple 4 : effectue un pull client


public class PullClientServlet extends HttpServlet {
private int count = 10;

protected void doGet(HttpServletRequest req, HttpServletResponse resp)


throws ServletException, IOException {
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();

if (count > 0) {
resp.setHeader("Refresh","1"); Toutes les 1 seconde
count-- la page est recharge
out.println(count + "...");
et cela 10 fois de suite
} else {
out.println("Fin");
}
}
keulkeul.blogspot.com

PullClientServlet.java du projet
PullClient

Servlets - M. Baron - Page 57


HttpServlet : objet rponse HttpServletResponse

 Exemple 5 : effectue un push serveur


public class PushServerServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletOutpuStream out = res.getOutputStream();
res.setContentType("multipart/x-mixed-replace;boundary=End");
out.println();
out.println("--End");
Utilisation de
for (int i = 10; i > 0; i--) { multipart/mixed
out.println("Content-Type: text/plain");
out.println();
pour coder le pushing
out.println(i + "..."); serveur
out.println();
out.println("--End");

Connexion non ferme


out.flush();
try {
Thread.sleep(1000); mais rponse envoye
au client
} catch (InterruptedException e) {
e.printStackTrace();
}
keulkeul.blogspot.com

}
out.println("Content-Type: text/plain");
out.println();
Connexion ferme
out.println("Fin"); rponse envoye au
out.println("--End--");
out.flush(); client
}
} PushServerServlet.java du
projet PushServer Servlets - M. Baron - Page 58
Servlets et formulaires : du cot HTML

 Utilisation de la balise <FORM> </FORM>


 Option METHOD : type de requte GET ou POST
 Option ACTION : lURL o envoyer les donnes
 Utilisation de composants IHM pour saisir des informations
 Contenu lintrieur de la balise FORM

 Chaque composant est dfini au moyen dune balise particulire


SELECT, INPUT, TEXTAREA,
keulkeul.blogspot.com

 A lintrieur de chaque balise du composant (SELECT par exemple)


plusieurs options et notamment une (NAME) qui permet didentifier
le composant : NAME="mon_composant"
 Les donnes sont envoyes quand lutilisateur clique sur un bouton
de type SUBMIT Servlets - M. Baron - Page 59
Servlets et formulaires : du cot HTML

Le formulaire appelle
<body>
<p>Formulaire de satisfaction du cours Servlet/JSP </p>

une Servlet avec une


<form name="form1" method="get" action="form.html">
<p>

requte de type GET


Nom : <input type="text" name="nom">
Prnom : <input type="text" name="prenom">
</p>
<p>
Sexe :
<input type="radio" name="radio1" value="sexe" checked>masculin
<input type="radio" name="radio1" value="sexe">fminin
</p>
<p>Commentaire :<br>
<textarea name="textarea" cols="50" rows="10"> </textarea><br>
<input type="submit" name="Submit" rows="5" value="Soumettre">
</p>
</form>

index.html du projet
UIForm
keulkeul.blogspot.com

Il se peut que des composants


portent le mme identifiant.
Exemple : composant bouton radio

Servlets - M. Baron - Page 60


Servlets et formulaires : du cot Servlet

 Pour lire les donnes du formulaire : traiter la requte


 Accder par lintermdiaire de lobjet HttpServletRequest aux
paramtres
 String getParameter(String p) : retourne la valeur du paramtre p
 String[] getParamterValues(String p) : retourne les valeurs du
paramtre p Cette mthode est utile
public class UIFormServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
lorsque dans un
throws ServletException, IOException {
res.setContentType("text/plain");
formulaire vous avez
PrintWriter out = res.getWriter(); plusieurs composants qui
portent le mme nom
out.println("Nom : " + req.getParameter("nom"));
out.println("Prnom : " + req.getParameter("prenom"));

if (req.getParameterValues("radio1")[0].equals("mas")) {
out.print("C'est un homme. Il");
keulkeul.blogspot.com

} else {
out.print("C'est une femme. Elle");
}

out.print(" a crit sur ce magnifique cours que ");


out.println(req.getParameter("textarea"));
}
}

UIFormServlet.java du projet
UIForm Servlets - M. Baron - Page 61
Architecture de dveloppement d'une application WEB

 Une application WEB peut contenir plusieurs Servlets


 Pour tester et dployer une Servlet, il faut un systme
d'excution appel conteneur de Servlets ou moteur de
Servlets
 Le conteneur ralise le lien entre la Servlet et le serveur WEB
 Transforme code Java (bytecode) en HTML
 Associe des URL's virtuels une Servlet

/HelloWorldServlet/* Servlet 1
requte
keulkeul.blogspot.com

rponse /*.html
Servlet 2
/FormulaireServlet/*.htm

Conteneur de Servlets
Serveur Web

Il existe de nombreux conteneurs de


Servlets prsents dans la partie suivante
Servlets - M. Baron - Page 62
Architecture de dveloppement d'une application WEB

 Une application WEB est contenue dans un rpertoire phy-


sique sur le serveur
 Une application WEB possde une hirarchie de rpertoires
et de fichiers Respecter scrupuleusement la
hirarchie des rpertoires et
*.html, *.jsp, ... le nom des fichiers
Fichiers pour la prsentation
WEB-INF web.xml
Fichiers de configuration de
l'application WEB au format XML
*.class
keulkeul.blogspot.com

classes
Classes (bytecode) des Servlets

*.jar, *.class
lib
Fichiers bibliothques sous
diffrents formats

Servlets - M. Baron - Page 63


Les contextes ...

 Un contexte constitue une vue sur le fonctionnement dune


mme application web

 Possibilit daccder chacune des ressources de lapplication


web correspondant au contexte
 Servlets tudier la fin de cette partie
Collaboration de Servlets
 Pages JSP
Approfondissement sur la partie JSP
 ... Collaboration JSP Servlets : MVC
keulkeul.blogspot.com

 Utilisation du fichier web.xml pour la description de dploie-


ment du contexte Une application WEB ne
contient quun seul
contexte
Servlets - M. Baron - Page 64
Le fichier web.xml : cest quoi ?

 Le fichier web.xml regroupe les informations de fonctionne-


ment de l'application WEB (description de dploiement du contexte)
 Utilisation du format XML
 eXtensible Markup Language
 Syntaxe universelle pour la structuration des donnes cre par le
World Wide Web Consortium (W3C) en 1996
 Langage bas sur des balises permettant de donner une signification
au document (HTML s'intresse essentiellement l'affichage)
 Extensible par la possibilit de crer de nouvelles balises
 Balises XML sensibles la case et la rigueur (balise ouvrante =
obligation d'une balise fermante)
keulkeul.blogspot.com

 La structure du document est dfini par un fichier XSD (XML Schema


Description)
Des informations sur le format
XML peuvent tre trouves
www.w3.org/XML Servlets - M. Baron - Page 65
Le fichier web.xml : cest quoi ?

 Fichier web.xml typique La prsence du fichier


web.xml est obligatoire
En-tte du fichier web.xml
pour que vos servlets WEB
Balise principale
fonctionnent
<?xml version="1.0" encoding="UTF-8"?>
Balise de description de <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
l'application WEB xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
Balise de description version="2.4">
<display-name>Application WEB affichant HelloWorld</display-name>
d'une Servlet

Nom de la Servlet <servlet>


<servlet-name>HelloWorldServlet</servlet-name>
"Identification" <servlet-class>HelloWorld</servlet-class>
</servlet>
Classe de la Servlet
keulkeul.blogspot.com

Dfinition d'un chemin


virtuel
<servlet-mapping>
Nom de la Servlet considr <servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/msg.hello</url-pattern>
"Identification" </servlet-mapping>
</web-app>

Dfinition du chemin virtuel


Servlets - M. Baron - Page 66
Le fichier web.xml : cest quoi ?

 Possibilit de dcrire dans le fichier web.xml le fonctionne-


ment de plusieurs Servlets
web.xml du projet
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
HelloWorld
<display-name>Servlets affichant diffremment le message
HelloWorld
Lapplication WEB est </display-name>

ici compose de deux <servlet>


Servlets <servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet>
<servlet-name>HelloWorldPrintWriter</servlet-name>
Deux faon diffrentes <servlet-class>HelloWorldPrintWriter</servlet-class>
</servlet>
dappeler la Servlet
HelloWorldServlet <servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>*.toutpourservlet</url-pattern>
keulkeul.blogspot.com

</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/msg.hello</url-pattern>
</servlet-mapping>
Une seule faon dappeler <servlet-mapping>
la Servlet <servlet-name>HelloWorldPrintWriter</servlet-name>
<url-pattern>/printwriter.html</url-pattern>
HelloWorldPrintWriter </servlet-mapping>
</web-app>
Servlets - M. Baron - Page 67
Le fichier web.xml : cest quoi ?

 Le fichier web.xml permet la dfinition de chemin virtuel :


mais comment sont-ils utiliss pour appeler les Servlets ?
web.xml du projet ...
<servlet-mapping>
HelloWorld <servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/HelloWorldServlet/msg.hello</url-pattern>
Trois chemins virtuels ont </servlet-mapping>
<servlet-mapping>
t dfinis pour excuter la <servlet-name>HelloWorldServlet</servlet-name>
Servlet HelloWorldServlet <url-pattern>*.toutpourservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
Contexte de <servlet-name>HelloWorldServlet</servlet-name>
Adresse du Port l'application
<url-pattern>/index.html</url-pattern>

Serveur
</servlet-mapping>
WEB ...

http://localhost:8080/HelloWorldServlet
http://localhost:8080/HelloWorldServlet/bonjour.toutpourservlet
keulkeul.blogspot.com

http://localhost:8080/HelloWorldServlet/hello.toutpourservlet
http://localhost:8080/HelloWorldServlet/HelloWorldServlet/msg.hello

La dfinition du contexte dune application


WEB sera prsente dans la partie suivante Servlets - M. Baron - Page 68
Cycle de vie d'une Servlet

 Cration et initialisation de la Servlet


 Utilisation de paramtres initiaux

 Traitement des services demands par les clients (au travers


de la mthode service() notamment), le cas chant
 Persistance dinstance

 Destruction de la Servlet et passage au ramasse-miettes de la


machine virtuelle
keulkeul.blogspot.com

 Dconnexion avec une base de donnes

Au contraire les applications serveur de


type CGI sont cres chaque requte et
dtruites aprs le traitement des rponses
Servlets - M. Baron - Page 69
Cycle de vie d'une Servlet : persistance dinstance

 Entre chaque requte du client les Servlets persistent


sous forme dinstances dobjet
 Au moment o le code dune Servlet est charg, le serveur
ne cre quune seule instance de classe
 Linstance (unique) traite chaque requte effectue sur la
Servlet
 Les avantages (rappels)
 Lempreinte mmoire reste petite
keulkeul.blogspot.com

 Le surcot en temps li la cration dun nouvel objet pour la Servlet


est limin
 La persistance est possible cest--dire la possibilit de conserver ltat
de lobjet chaque requte (un exemple le compteur)
Servlets - M. Baron - Page 70
Cycle de vie d'une Servlet : persistance dinstance

 Exemple : Servlet qui incrmente un compteur chaque


requte du client
public class SimpleCounterServlet extends HttpServlet {
private int count = 0;

protected void doGet(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
count++;

out.println("Depuis son chargement, on a accd cette Servlet " +


count " fois.");
}
}
keulkeul.blogspot.com

Pensez prvoir des accs SimpleCounterServlet.java du


projet Counter
synchroniss au cas o plus
dune requte est traite en
mme temps par le Serveur
Servlets - M. Baron - Page 71
Cycle de vie d'une Servlet : rechargement dune Servlet

 A chaque rechargement dune Servlet par le conteneur de


Servlet, il y a cration dune nouvelle instance et donc
destruction de lancienne

 Le rechargement dune Servlet a lieu quand il y a :

 Modification dau moins une classe de lapplication WEB

 Demande explicite de ladministrateur du serveur WEB

 Redmarrage du conteneur de Servlets


keulkeul.blogspot.com

Le conteneur de Servlets ne sintresse quau


Servlet et par consquent si vous modifiez
autre chose que des classes il ny aura aucun
rechargement implicite de Servlets
Servlets - M. Baron - Page 72
Cycle de vie d'une Servlet : mthodes init()

 Un constat : il ny a pas de constructeur dans une Servlet


 Linitialisation des attributs se fait par lintermdiaire de la
mthode init()
 Elle ne possde pas de paramtre
 Dfinie et implmente dans la classe abstraite GenericServlet

 La mthode init() peut tre appele diffrents moments


 Lorsque le conteneur de Servlets dmarre
 Lors de la premire requte la Servlet
keulkeul.blogspot.com

 Sur demande explicite de ladministrateur du serveur WEB

Nessayez pas de placer des


constructeurs la mode
POO a ne sert rien
Servlets - M. Baron - Page 73
Cycle de vie d'une Servlet : mthode init()

 Exemple : Servlet qui incrmente un compteur chaque


requte du client avec une valeur initiale de 6

public class InitCounterServlet extends HttpServlet {


private int count;

public void init() throws ServletException {


count = 6;
}

protected void doGet(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
count++;
keulkeul.blogspot.com

out.println("Depuis son chargement, on a accd cette Servlet " +


count " fois.");
}
}

InitCounterServlet.java du
projet Counter Servlets - M. Baron - Page 74
Cycle de vie d'une Servlet : mthode init()

 Possibilit dutiliser des paramtres dinitialisation exploits


exclusivement par la mthode init()
 Les paramtres dinitialisation sont dfinis dans le fichier
web.xml de lapplication WEB
...
Balise qui dtermine <web-app ...>
le nom du paramtre <display-name>Servlet simulant un compteur</display-name>

<servlet>
<servlet-name>InitConfigFileCounterServlet</servlet-name>
Balise qui dtermine la <servlet-class>InitConfigFileCounterServlet</servlet-class>
valeur du paramtre <init-param>
<param-name>initial_counter_value</param-name>
<param-value>50</param-value>
<description>Valeur initiale du compteur</description>
keulkeul.blogspot.com

Balise qui explique </init-param>


</servlet>
le rle du paramtre ...
(optionnelle) </web-app>

Plusieurs paramtres peuvent tre dfinis web.xml du projet


Counter
mais attention lordre des balises !!
Servlets - M. Baron - Page 75
Cycle de vie d'une Servlet : mthode init()

 Exemple : Servlet qui incrmente un compteur et qui est


initialise par le fichier web.xml
public class InitConfigFileCounterServlet extends HttpServlet {
private int count;

public void init() throws ServletException {


String initial = this.getInitParameter("initial_counter_value");
try {
count = Integer.parseInt(initial);
} catch(NumberFormatException e) {
count = 0;
}
}

protected void doGet(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
...
keulkeul.blogspot.com

count++;

out.println("Depuis son chargement, on a accd cette Servlet " +


count " fois.");
}
}
InitConfigFileCounterServlet.java
du projet Counter Servlets - M. Baron - Page 76
Cycle de vie d'une Servlet : mthode destroy()

 Une Servlet doit librer toutes les ressources quelle a


acquises et qui ne pourront tre passes au ramasse-miettes

 Exemples de ressources
 Connexion une base de donnes

 Ouverture dun fichier sur le disque serveur

 La mthode destroy() donne une dernire chance dcrire les


informations qui ne sont pas encore sauvegardes
keulkeul.blogspot.com

 La mthode destroy() est galement utilises pour crire les


informations persistantes qui seront lues lors du prochain
appel init()
Servlets - M. Baron - Page 77
Cycle de vie d'une Servlet : mthode destroy()

 Exemple : Servlet qui incrmente un compteur qui sauve-


garde ltat avec destroy() et qui recharge avec init()
public class InitDestroyCounterServlet extends HttpServlet {
private int count;

public void destroy() {


FileWriter fileWriter = null; PrintWriter printWriter = null;
try {
fileWriter = new FileWriter("InitCounter.initial");
printWriter = new PrintWriter(fileWriter);
printWriter.println(count);
} catch (IOException e) {
...
} finally {
if (printWriter != null) printWriter.close();
}
keulkeul.blogspot.com

protected void doGet(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
...
}
} InitDestoryCounterServlet.java
du projet Counter
Servlets - M. Baron - Page 78
Cycle de vie d'une Servlet : mthode destroy()

 Exemple (suite) : Servlet qui incrmente un compteur qui


sauvegarde ltat avec destroy() et qui recharge avec init()
...
public void destroy() {
// Voir transparent prcdent
}

public void init() throws ServletException {


FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader("InitCounter.initial");
bufferedReader = new BufferedReader(fileReader);
String initial = bufferedReader.readLine();
count = Integer.parseInt(initial);
} catch (IOException e) {
keulkeul.blogspot.com

...
} finally {
if (bufferedReader != null)
bufferedReader.close();
}
}
} InitDestoryCounterServlet.java
du projet Counter
Servlets - M. Baron - Page 79
Envoyer un contenu multimdia

 Pour linstant nous avons crit des Servlets qui retournaient


des contenus HTML

 Besoin de retourner des contenus diffrents :


 Protocole WAP et langage WML utiliss par les tlphones portables

 Gnration de contenus multimdias (cration de graphes, manipula-


tion dimages)

 LAPI Java facilite la gestion des contenus multimdias en


keulkeul.blogspot.com

proposant des bibliothques


 Encodage dimages sous diffrents formats (GIF, JPEG)

 Manipulation et traitement dimages


Servlets - M. Baron - Page 80
Envoyer un contenu multimdia

 Exemple : Servlet qui gnre et retourne une image JPEG


affichant le message Bonjour tout le monde
public class GenerateImageServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
ServletOutputStream out = res.getOutputStream();
Frame frame = null; Graphics2D g = null; BufferedImage bim;

frame = new Frame(); frame.addNotify();


buffer_image = new BufferedImage(620, 60, BufferedImage.TYPE_3BYTE_BGR);

g = buffer_image.createGraphics();
g.setFont(new Font("Serif", Font.ITALIC, 48));
g.drawString("Bonjour tout le monde !", 10,50);

JPEGImageEncoder encode = JPEGCodec.createJPEGEncoder(out);


keulkeul.blogspot.com

encode.encode(buffer_image);
out.close();
}
}

GenerateImageServlet.java du
projet Multimedia
Servlets - M. Baron - Page 81
Suivi de session

 Le protocole HTTP est un protocole sans tat

 Impossibilit alors de garder des informations dune requ-


te lautre (identifier un client dun autre)

 Obligation dutiliser diffrentes solutions pour remdier au


problme dtat
 Authentifier lutilisateur

 Champs de formulaire cachs


keulkeul.blogspot.com

 Rcriture dURL

 Cookies persistants

 Suivi de session
Servlets - M. Baron - Page 82
Cookies persistants : Cookie

 Un cookie est une information envoye au navigateur


(client) par un serveur WEB qui peut ensuite tre relue par
le client
 Lorsquun client reoit un cookie, il le sauve et le renvoie
ensuite au serveur chaque fois quil accde une page sur
ce serveur
 La valeur dun cookie pouvant identifier de faon unique un
client, ils sont souvent utiliss pour le suivi de session
keulkeul.blogspot.com

 Les cookies ont t introduits par la premire fois dans


Netscape Navigator
 home.netscape.com/newsref/std/cookie_spec.html
 www.cookie-central.com Servlets - M. Baron - Page 83
Cookies persistants : Cookie

 LAPI Servlet fournit la classe javax.servlet.http.Cookie pour


travailler avec les Cookies
 Cookie(String name, String value) : construit un cookie
 String getName() : retourne le nom du cookie
 String getValue() : retourne la valeur du cookie
 setValue(String new_value) : donne une nouvelle valeur au cookie
 setMaxAge(int expiry) : spcifie lge maximum du cookie
 Pour la cration dun nouveau cookie, il faut lajouter la
rponse (HttpServletResponse)
 addCookie(Cookie mon_cook) : ajoute la rponse un cookie
keulkeul.blogspot.com

 La Servlet rcupre les cookies du client en exploitant la


rponse (HttpServletRequest)
 Cookie[] getCookies() : rcupre lensemble des cookies du site
Servlets - M. Baron - Page 84
Cookies persistants : Cookie

 Code pour crer un cookie et lajouter au client

Cookie cookie = new Cookie("Id", "123");


res.addCookie(cookie);

 Code pour rcuprer les cookies

Cookie[] cookies = req.getCookies();


if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
}
}
keulkeul.blogspot.com

Il nexiste pas dans lAPI Servlet


de mthode permettant de rcuprer
la valeur dun cookie par son nom

Servlets - M. Baron - Page 85


Cookies persistants : Cookie

 Exemple : gestion de session (identifier un client dun autre)


par lintermdiaire des cookies persistants
public class CookiesServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
...
String sessionId = null;
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("sessionid")) {
sessionId = cookies[i].getValue();
}}}
if (sessionId == null) {
sessionId = new java.rmi.server.UID().toString();
Cookie c = new Cookie("sessionid", sessionId);
keulkeul.blogspot.com

res.addCookie(c);
out.println("Bonjour le nouveau");
Gnre un identifiant
} else {
out.println("Encore vous"); ... } unique pour chaque
} client
}

CookiesServlet.java du projet
Cookies Servlets - M. Baron - Page 86
Suivi de session : HttpSession

 Le plus gros problme des cookies est que les navigateurs


ne les acceptent pas toujours

 Lutilisateur peut
configurer son
navigateur pour quil
refuse ou pas les
cookies
keulkeul.blogspot.com

 Les navigateurs nacceptent que 20 cookies par site, 300 par


utilisateur et la taille dun cookie peut tre limite 4096
octets
Servlets - M. Baron - Page 87
Suivi de session : HttpSession

 Solutions : utilisation de lAPI de suivi de session HttpSession


 Mthodes de cration lies la requte (HttpServletRequest)
 HttpSession getSession() : retourne la session associe lutilisateur
 HttpSession getSession(boolean p) : cration selon la valeur de p

 Gestion dassociation (HttpSession)


 Enumeration getAttributNames() : retourne les noms de tous les
attributs
 Object getAttribut(String name) : retourne lobjet associ au nom
 setAttribut(String na, Object va) : modifie na par la valeur va
keulkeul.blogspot.com

 removeAttribut(String na) : supprime lattribut associ na

 Destruction (HttpSession) Mcanisme trs puissant


permettant de stocker des objets et
 invalidate() : expire la session non de simples chanes de
caractres comme les cookies
 logout() : termine la session Servlets - M. Baron - Page 88
Suivi de session : HttpSession

 Exemple : suivi de session pour un compteur


public class HttpSessionServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain"); PrintWriter out = res.getWriter();
HttpSession session = req.getSession();
Integer count = (Integer)session.getAttribute("count");
if (count == null)
count = new Integer(1);
else
count = new Integer(count.intValue() + 1);
session.setAttribute("count", count);
out.println("Vous avez visit cette page " + count + " fois.");
}
}

HttpSessionServlet.java
du projet HttpSession
keulkeul.blogspot.com

Client n2

Client n1 Servlets - M. Baron - Page 89


Collaboration de Servlets

 Les Servlets sexcutant dans le mme serveur peuvent


dialoguer entre elles

 Deux principaux styles de collaboration


 Partage dinformation : un tat ou une ressource.
Exemple : un magasin en ligne pourrait partager les informations sur
le stock des produits ou une connexion une base de donnes

 Partage du contrle : une requte.


Rception dune requte par une Servlet et laisser lautre Servlet une
keulkeul.blogspot.com

partie ou toute la responsabilit du traitement

Nessayez pas de communiquer avec


des Servlets de serveurs diffrents
cette solution ne fonctionnera pas
Servlets - M. Baron - Page 90
Collaboration de Servlets : partage dinformation

 La collaboration est obtenue par linterface ServletContext


 Lutilisation de ServletContext permet aux applications web
de disposer de son propre conteneur dinformations unique
 Une Servlet retrouve le ServletContext de son application web
par un appel getServletContext()
 Exemples de mthodes
 void setAttribute(String name, Object o) : lie un objet sous le nom
indiqu
 Object getAttribute(String name) : retrouve lobjet sous le nom indiqu
keulkeul.blogspot.com

 Enumeration getAttributeNames() : retourne lensemble des noms de


tous les attributs lis
 void removeAttribute(String name) : supprime lobjet li sous le nom
indiqu Servlets - M. Baron - Page 91
Partage dinformation

 Exemple : Servlets qui vendent des pizzas et partagent une


spcialit du jour Cration de deux
public class PizzasAdmin extends HttpServlet { attributs
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
ServletContext context = this.getServletContext();
context.setAttribute("Specialite", "Jambon Fromage");
context.setAttribute("Date", new Date());
out.println("La pizza du jour a t dfinie.");
}
} PizzasAdmin.java du projet
ServletContext
public class PizzasClient extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)

...
throws ServletException, IOException {
Lecture des
attributs
keulkeul.blogspot.com

ServletContext context = this.getServletContext();


String pizza_spec = (String)context.getAttribute("Specialite");
Date day = (Date)context.getAttribute("Date");
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
String today = df.format(day);
out.println("Aujourd'hui (" + today + "), notre specialite est : " + pizza_spec);
}}

PizzasClient.java du projet
ServletContext Servlets - M. Baron - Page 92
Partage dinformation

 Possibilit de partager des informations entre contextes web


 Premire solution : utilisation dun conteneur dinformations
externes (une base de donnes par exemple)
 Seconde solution : la Servlet recherche un autre contexte
partir de son propre contexte
 ServletContext getContext(String uripath) : obtient le contexte partir
dun chemin URI (uripath = chemin absolu)
Contextes WEB
Conteneur de Servlets

Servlet 1
keulkeul.blogspot.com

Servlet 2
Servlet 3
Ne fonctionne
que dans le Servlet 4 Communication
par le contexte
mme serveur
Serveur Web
WEB Servlets - M. Baron - Page 93
Partage dinformation

 Exemple : permet dafficher la spcialit du jour de lapplica-


tion web prcdente
public class ReadSharePizzas extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html"); Contextes de lapplication
PrintWriter out = res.getWriter(); web prcdente
ServletContext my_context = this.getServletContext();
ServletContext pizzas_context = my_context.getContext("/ServletContext");
String pizza_spec = (String)pizzas_context.getAttribute("Specialite");
Date day = (Date)pizzas_context.getAttribute("Date");

DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
String today = df.format(day);

out.println("Aujourd'hui (" + today + "), notre specialite est : " + pizza_spec);


}
keulkeul.blogspot.com

ReadSharePizzas.java du projet
Pour communiquer entre contextes, CrossServletContext
il faut autoriser la communication
inter-contextes (voir partie suivante)
Servlets - M. Baron - Page 94
Collaboration de Servlets : partage du contrle

 Les Servlets peuvent partager ou distribuer le contrle de la


requte

 Deux types de distribution


 Distribuer un renvoi : une Servlet peut renvoyer une requte entire

 Distribuer une inclusion : une Servlet peut inclure du contenu gnr

 Les avantages sont


 La dlgation de comptences
keulkeul.blogspot.com

 Une meilleure abstraction et une plus grande souplesse

 Architecture logicielle MVC (Servlet = contrle et JSP = prsentation)

Collaboration entre Servlets /


JSP dans la partie JSP
Servlets - M. Baron - Page 95
Collaboration de Servlets : partage du contrle

 Le support de la dlgation de requte est obtenu par linter-


face RequestDispatcher
 Une Servlet obtient une instance sur la requte
 RequestDispatcher getRequestDispatcher(String path) : retourne une
instance de type RequestDispatcher par rapport un composant
 Un composant peut-tre de tout type : Servlet, JSP, fichier statique,
 path est un chemin relatif ou absolu ne pouvant pas sortir du contexte

 Pour distribuer en dehors du contexte courant il faut :


 Identifier le contexte extrieur (utilisation de getContext())
keulkeul.blogspot.com

 Utiliser la mthode getRequestDispatcher(String path)


 Le chemin est uniquement en absolu
De prfrence utilisez la mthode
getRequestDispatcher de
ServletRequest Servlets - M. Baron - Page 96
Partage du contrle : distribuer un renvoi

 La mthode forward(...) de linterface RequestDispatcher


renvoie une requte dune Servlet une autre ressource sur
le serveur
 void forward(ServletRequest req, ServletResponse res) : redirection de
requte
RequestDispatcher dispat =
req.getRequestDispatcher("/index.html");
dispat.forward(req,res);

 Possibilit de transmettre des informations lors du renvoi


 en attachant une chane dinterrogation (au travers de lURL)
 en utilisant les attributs de requte via la mthode setAttribute(...)
keulkeul.blogspot.com

 Les choses ne pas faire ...


 ne pas effectuer de modification sur la rponse avant un renvoi
 ne rien faire sur la requte et la rponse aprs une distribution dun
renvoi Servlets - M. Baron - Page 97
Partage du contrle : distribuer un renvoi

 Exemple : distribuer un renvoi de Emetteur Recepteur


public class SenderServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
Transmission
throws ServletException, IOException { dinformations par
req.setAttribute("seconde", "au revoir"); attributs

RequestDispatcher dispat = req.getRequestDispatcher("/recepteur.html?mot=bonjour");


dispatcher.forward(req,res);
// Ne rien faire sur req et res Le chemin est absolu par Transmission
} rapport au contexte de dinformations par
} lapplication web chane dinterrogation
SenderServlet.java du projet
ForwardInclude
public class ReceiverServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
keulkeul.blogspot.com

out.println(req.getParameter("mot")); Affichage des


out.println(req.getAttribute("seconde")); informations stockes
} dans la requte
}

Lutilisation des attributs la place des ReceiverServlet.java du projet


paramtres donne la possibilit de passer ForwardInclude
des objets et non des chanes de caractres Servlets - M. Baron - Page 98
Partage du contrle : distribuer un renvoi

 Nous avons vu au dbut de cette partie quil existait une


mthode de redirection
 sendRedirect() est une redirection effectue par le client

 forward() est une redirection effectue par le serveur

 Est-il prfrable dutiliser forward() ou sendRedirect() ???


 forward() est utiliser pour la partage de rsultat avec un autre
composant sur le mme serveur

 sendRedirect() est utiliser pour des redirections externes car


keulkeul.blogspot.com

aucune recherche getContext(...) nest ncessaire


Prfrez forward() pour des
redirections dans le contexte et
sendRedirect() pour le reste
Servlets - M. Baron - Page 99
Partage du contrle : distribuer une inclusion

 La mthode include() de linterface RequestDispatcher


inclut le contenu dune ressource dans la rponse courante
RequestDispatcher dispat =
req.getRequestDispatcher("/index.html");
dispat.include(req,res);

 La diffrence avec une distribution par renvoi est :


 la Servlet appelante garde le contrle de la rponse
 elle peut inclure du contenu avant et aprs le contenu inclus

 Possibilit de transmettre des informations lors de linclusion


 en attachant une chane dinterrogation (au travers de lURL)
keulkeul.blogspot.com

 en utilisant les attributs de requte via la mthode setAttribute(...)


 Les choses ne pas faire ...
 ne pas dfinir le code dtat et en-ttes (pas de setContentType())
 supprimer les balises <HTML> et <BODY> Servlets - M. Baron - Page 100
Partage du contrle : distribuer une inclusion

 Exemple : permet de distribuer une inclusion


public class IncluderServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<HTML><BODY>");

RequestDispatcher dispat = req.getRequestDispatcher("included.html");


dispat.include(req,res);
out.println("<br>");

req.setAttribute("bonjour", "Bonjour"); Cette Servlet ralise trois


dispat.include(req,res); inclusions
out.println("<br>");

req.setAttribute("bonsoir", "Bonsoir");
keulkeul.blogspot.com

dispat.include(req,res);
out.println("<br>");

out.println("</BODY></HTML>");
}
} IncluderServlet.java du projet
ForwardInclude
Servlets - M. Baron - Page 101
Partage du contrle : distribuer une inclusion

 Exemple (suite) : permet de distribuer une inclusion


public class IncludedServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
PrintWriter out = res.getWriter();
if(req.getAttribute("bonjour") != null) {
out.println(req.getAttribute("bonjour"));
if (req.getAttribute("bonsoir") != null) {
out.println(req.getAttribute("bonsoir"));
} else {
out.println("Pas Bonsoir");
}
} else {
out.println("Rien de rien"); Retour lappelant
}
}
}
keulkeul.blogspot.com

IncludedServlet.java du projet
ForwardInclude

Servlets - M. Baron - Page 102


Scurit : authentification

 La scurit consiste conserver les informations sensibles


dans les mains des utilisateurs
 Authentification : capable de vrifier lidentit des parties impliques
 Habilitation : limiter laccs aux ressources un ensemble dutilisateurs
 Confidentialit : garantir la communication des parties impliques

 Nous distinguons plusieurs types d'autorisation :


 BASIC : fournit par le protocole HTTP bas sur un modle simple de
demande/rponse (codage Base64)
keulkeul.blogspot.com

 FORM : authentification ne reposant pas celle du protocole HTTP

Servlets - M. Baron - Page 103


Scurit : types d'autorisation

 Principe des autorisations de type BASIC

GET / HTTP/1.1

Application
HTTP/1.1 401 Unauthorized WEB
WWW-Authenticate: BASIC
realm="Users"

GET / HTTP/1.1
Autorisation: BASIC RkfddsIRSddO=
Client Web Serveur Web Vrification si l'utilisateur
est connu et son mot de
 Principe des autorisations de type FORM passe correct

GET / HTTP/1.1
keulkeul.blogspot.com

Application
HTTP/1.1 200 OK
Content-Type: text/html
WEB
...
POST / HTTP/1.1
...
Serveur Web
Client Web
Donnes caches et non visible
Servlets - M. Baron - Page 104
Scurit : deux familles d'identification pour les Servlets

 Gre par le conteneur de Servlets (Ident 1) :


 Spcification d'un domaine de scurit dans le fichier de configuration
web.xml
 Les utilisateurs sont grs (l'utilisateur existe-il, le mot de passe est-il
correct, ) uniquement par le conteneur de Servlets
 Base sur les rles (BASIC)
 A base de formulaire (FORM)

 Effectue lintrieur des Servlets (Ident 2) :


keulkeul.blogspot.com

 Les utilisateurs sont stocks dans une base de donnes, un fichier,


 La vrification est effectue dans les Servlets (besoin d'un codage)
 Personnalise (BASIC)
 Personnalise base de formulaire (FORM) Servlets - M. Baron - Page 105
Authentification base sur les rles : Ident 1

 Exemple : Servlet qui aprs identification affiche un ensem-


ble d'informations Aucune vrification dans
le code de la Servlet pour
public class SecurityRolesServlet extends HttpServlet { l'identification
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();

out.println("Bonjour : " + req.getRemoteUser());


out.println("Information Top-Secrte");
out.println("Type d'authentification : " + req.getAuthType());

out.println("Est-un administrateur : " + req.isUserInRole("admin"));


}
}
Conteneur de
keulkeul.blogspot.com

SecurityRolesServlet.java du projet Servlets


Ou
AuthentificationByRoles n i
a tio
t i fic e ?
en si
Id rus

Servlets - M. Baron - Page 106


Authentification base sur les rles : Ident 1

 Besoin de modification du fichier de configuration web.xml


web.xml du projet
de l'application WEB considre AuthentificationByRoles
...
Dfinition des Servlets
<web-app ...>
<display-name>Gestion d'une authentification par "Roles"</display-name>
<servlet> contenues dans
<servlet-name>SecuriteRolesServlet</servlet-name> l'application WEB et des
<servlet-class>SecuriteRolesServlet</servlet-class>
</servlet> chemins virtuels
<servlet-mapping>
<servlet-name>SecuriteRolesServlet</servlet-name>
<url-pattern>/SecuriteRolesServlet</url-pattern>
Dfinit pour quelles URL la
</servlet-mapping> contrainte didentification
doit tre mise en uvre
<security-constraint>
<web-resource-collection>
<web-resource-name>SecretProtection</web-resource-name> Protection des
<url-pattern>/SecuriteRolesServlet</url-pattern>
<http-method>GET</http-method> ressources pour la
</web-resource-collection> mthode GET
<auth-constraint>
<role-name>test</role-name>
Rle(s) ayant le droit
keulkeul.blogspot.com

</auth-constraint> d'accder aux ressources de


</security-constraint> l'application WEB
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Authentification de SecuriteRoleServlet</realm-name> Habillage de la
</login-config> bote didentification
</web-app>
La dfinition des rles sera
prsente dans la partie suivante Servlets - M. Baron - Page 107
Authentification personalise base sur les rles : Ident 1

 Exemple : Servlet qui aprs identification personnalise


affiche un message de bienvenue Aucune vrification dans
le code{ de la Servlet pour
public class SecurityFormRolesServlet extends HttpServlet
l'identification
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("Bonjour : " + req.getRemoteUser()); Termine explicitement la
req.getSession().invalidate(); session. Obligation de
} sidentifier chaque fois
} que la Servlet est appele
Conteneur de
Servlets
SecurityFormRolesServlet.java du projet
Oui
AuthentificationFormByRoles tion
a
fic e ?

No
t i
en si

n
Id rus
keulkeul.blogspot.com

loginpage.html

Deux fichiers au format HTML grent errorpage.html


les pages de connexion et derreur
Servlets - M. Baron - Page 108
Authentification personalise base sur les rles : Ident 1

 Besoin de modification du fichier de configuration web.xml


de l'application WEB considre
...
<web-app ...>
... Le dbut du fichier web.xml
est identique au prcdent
<servlet> ... </servlet>
<servlet-mapping> ... </servlet-mapping>
<security-constraint> ... </security-constraint> modulo le nom de la classe
SecuriteFormServlet
<login-config>
<auth-method>
FORM
</auth-method>
<form-login-config> Balise qui stocke la
page de connexion
<form-login-page>
/loginpage.html
</form-login-page>
<form-error-page>
/errorpage.html
</form-error-page>
</form-login-config>
</login-config> Balise qui stocke la
keulkeul.blogspot.com

</web-app>
page des erreurs de
web.xml du projet connexion
AuthentificationFormByRoles

Les fichiers HTML sont placs la


racine de lapplication WEB et au mme
niveau que le rpertoire WEB-INF Servlets - M. Baron - Page 109
Authentification personalise base sur les rles : Ident 1

 Le formulaire de la page loginpage.html doit employer


 la mthode POST pour la transmission des donnes
 des valeurs spciales pour les noms des composants

Le moteur de Servlet avec les informations


Rend invisible la contenues dans le fichier web.xml se charge
transmission des donnes de traiter lidentification

<FORM METHOD=POST ACTION="j_security_check">


Valeur pour le nom
dutilisateur
Nom dutilisateur : <INPUT TYPE=TEXT NAME="j_username"><br>

Mot de passe : <INPUT TYPE=PASSWORD NAME="j_password"><br>


keulkeul.blogspot.com

<INPUT TYPE=SUBMIT>
</FORM>

Valeur pour le mot loginpage.html du projet


C'est du JSP de passe AuthentificationFormByRoles

Servlets - M. Baron - Page 110


Authentification personnalise : Ident 2

 Exemple : Servlet qui traite les autorisations de type BASIC


public class SecurityServlet extends HttpServlet { SecurityServlet.java du projet
private Hashtable users = new Hashtable(); AuthentificationByServlet
public void init(ServletConfig config) throws ServletException {
super.init(config);
users.put("mickael:baron","allowed"); Rcupre dans la
}
requte le HEADER
public void doGet(HttpServletRequest req, HttpServletResponse res) nomm Authorization
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter(); Sil sagit du premier essai ou
String auth = req.getHeader("Authorization"); dune mauvais saisie => envoie
d une rponse avec len-tte
if (!allowUser(auth)) {
res.setHeader("WWW-Authenticate", "BASIC realm=\"users\"");
WWW-Authenticate et l tat
res.sendError(HttpServletResponse.SC_UNAUTHORIZED); SC_UNAUTHORIZED
} else out.println("Page Top-Secret");
}

protected boolean allowUser(String auth) throws IOException {


if (auth == null) return false;
if (!auth.toUpperCase().startsWith("BASIC "))
keulkeul.blogspot.com

return false;

String userpassEncoded = auth.substring(6); Mthode qui traite


String userpassDecoded = Base64EnDecoder.decode(userpassEncoded);
le rsultat de len-
return ("allowed".equals(users.get(userpassDecoded))); tte Authorization
}
}
La vrification de lidentification est
effectue dans le code de la Servlet Servlets - M. Baron - Page 111
Authentification personnalise base de formulaire :
Ident 2
 Diffrences avec les autres types didentification
 Cette identification part dun formulaire basique avec une protection
minimum des transmissions grce la mthode POST
 Cette identification compare lidentification personnalise base
sur les rles est dmarre directement par la page WEB de
connexion (login.html)
Au contraire lidentification personnalise base sur les rles est
dmarre au travers de son URL virtuelle

Transmission par POST


keulkeul.blogspot.com

Servlet de Correcte
traitement
login.html
Errone

Servlets - M. Baron - Page 112


Authentification personnalise base de formulaire :
Ident 2
 Exemple : Servlet qui traite les autorisations de type FORM
Le mot de passe est
public class SecurityFormServlet extends HttpServlet {
private Hashtable users = new Hashtable(); cach dans la requte
de type POST
public void init(ServletConfig config) throws ServletException {
users.put("mickael:baron","allowed");
}
Rcupre les variables
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException { qui ont t transmises
res.setContentType("text/html"); par le formulaire de
PrintWriter out = res.getWriter();
login.html
String account = req.getParameter("account");
String password = req.getParameter("password"); Gnre une page
if (!allowUser(account, password)) { derreur avec la
out.println("<HTML><HEAD><TITLE>Access Denied</TITLE></HEAD>"); possibilit de sidentifier
out.println("<BODY>Votre compte et mot de passe sont incorrects.<BR>");
out.println("<A HREF=\"/SecuritePersoFormServlet/login.html\">
une nouvelle fois
Retenter</A>");
out.println("</BODY></HTML>");
keulkeul.blogspot.com

} else {
req.getSession().setAttribute("logon.isDone", account);
out.println("Bravo : " + account); Lidentification est
}
}
russie et on modifie la
... session en ajoutant le
} nom de lutilisateur
SecurityFormServlet.java du projet
AuthentificationFormByServlet
Servlets - M. Baron - Page 113
Se connecter aux bases de donnes

 Utilisation de lAPI JDBC (Java DataBase Connectivity)


 JDBC est une API du niveau SQL, elle permet dexcuter des
instructions SQL et de retrouver les rsultats (sil y en a)
 LAPI est un ensemble dinterfaces et de classes conues pour
effectuer des actions sur toute base de donnes (mySQL, ORACLE,
SYBASE, ODBC, Derby)
 Utilisation dun gestionnaire de pilotes JDBC
 Un pilote JDBC spcifique une base de donnes implmente
linterface java.sql.Driver
 Peut dialoguer avec tout pilote conforme l API JDBC o les pilotes
sont disponibles java.sun.com/products/jdbc
 JDBC en quatre tapes
keulkeul.blogspot.com

 Charger le pilote
 Se connecter la base
 Crer et excuter une requte SQL
 Traiter le rsultat si ncessaire Servlets - M. Baron - Page 114
Se connecter aux bases de donnes : charger un pilote

 Le pilote est obligatoire, il convertit les appels JDBC en appels


natifs. Il est ncessaire de connatre le nom de la classe du
pilote JDBC que lon veut utiliser La librairie
 Pilote ORACLE : oracle.JDBC.driver.OracleDriver (gnralement .jar)
dsignant le pilote
 Pilote JDBC/ODBC : sun.jdbc.odbc.JdbcOdbcDriver doit tre plac dans
 Pilote mySQL : com.mysql.jdbc.Driver le rpertoire
WEB-INF/lib
 Pilote Derby : org.apache.derby.jdbc.ClientDriver
 Le chargement du pilote se fait en utilisant la mthode
Class.forName(String Pilote) throws ClassNotFoundException
Chargement du pilote
Exception leve sur
Derby
la classe pilote nest
keulkeul.blogspot.com

pas trouve
Class.forName("org.apache.derby.jdbc.ClientDriver");

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Chargement du
pilote ODBC Servlets - M. Baron - Page 115
Se connecter aux bases de donnes : se connecter la
base
 Pour se connecter une base de donnes il faut fournir une
URL qui indique o se trouve la base
 URL ORACLE : jdbc:oracle:thin:host:port:idbase
 URL ODBC : jdbc:odbc:IDDSN
 URL mySQL : jdbc:mysql:host
Exception leve si la connexion
 URL Derby : jdbc:derby:host la base est impossible

 La connexion la base se fait en utilisant la mthode


DriverManager.getConnection("URL","user","pass") throws SQLException
Connexion une base
mySQL nomme Espoir
keulkeul.blogspot.com

Connection ma_connexion =
DriverManager.getConnection("jdbc:mysql://localhost/Espoir","michael","baro
n");

Connection ma_connexion =
DriverManager.getConnection("jdbc:oracle:thin:@dbhost:1528:ORCL","michael",
"baron");
Connexion une base
ORACLE nomme ORCL Servlets - M. Baron - Page 116
Se connecter aux bases de donnes : crer et excuter
une requte SQL
 La requte ne peut tre cre et excute que si le pilote et
la connexion la base se sont valides
 Il faut avant tout crer une instruction SQL sur la base
createStatement() throws SQLException
Exception leve si l instruction
SQL ne peut tre cre

Statement mon_statement = ma_connexion.createStatement();

La rfrence de la connexion
une base de donnes
 Il faut enfin excuter la requte en crivant concrtement le
requte SQL executeQuery(String requete) throws SQLException
keulkeul.blogspot.com

Exception leve si le requte


SQL nest pas correcte

ResultSet mon_resultat = mon_statement.executeQuery("SELECT * FROM `table`");

La requte SQL
Rfrence de linstruction SQL
Servlets - M. Baron - Page 117
Se connecter aux bases de donnes : traiter le rsultat

 Enfin il faut traiter un objet de type ResultSet il existe de


nombreuses mthodes
 boolean next() : avancer dune ligne de la table rsultante
 String getString(String columName) : interroger un champ String par
son nom
 String getString(int columnIndex) : interroger un champ String par son
index
 int getInt() : interroger un champ Integer par son nom ou index
Accde la prochaine ligne
 sil y en a
keulkeul.blogspot.com

while (mon_resultat.next()) {
String colonne1 = mon_resultat.getString(1);
out.println("Nom:" + colonne1);
}

Affiche le rsultat en ligne Servlets - M. Baron - Page 118


Se connecter aux bases de donnes

 Exemple : Servlet qui interroge une base de donnes mySQL


public class DataBaseServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

res.setContentType("text/html"); DataBaseServlet.java du projet


PrintWriter out = res.getWriter(); DataBaseConnection
try {
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection ma_connexion =
DriverManager.getConnection("jdbc:derby://localhost:1527/PersonDB");
Statement mon_statement = ma_connexion.createStatement();
ResultSet mon_resultat = mon_statement.executeQuery("SELECT NAME,
FIRSTNAME, OLDYEAR FROM PERSON");
while (mon_resultat.next()) {
out.print("Nom : " + mon_resultat.getString(1));
out.print(" Prnom : " + mon_resultat.getString(2));
out.println(" Age : " + mon_resultat.getInt(3));
out.println("<br>");
}
keulkeul.blogspot.com

} catch(SQLException e) {
...
}
}
}
Noubliez pas dans la requte
SQL les cotes ` ` entre les
diffrentes tables
Servlets - M. Baron - Page 119

Das könnte Ihnen auch gefallen