Вы находитесь на странице: 1из 8

Maintien de l'tat

SERVLET (2/2)

Le protocole HTTP est un protocole sans tat


impossibilit de garder des informations dune requte lautre impossibilit d'identifier un client dun autre entre 2 requtes

Solutions =
les champs cachs la rcriture d'URLs les cookies les sessions
60 61

Champs cachs et rcriture d'URL


Champs cachs
Information dans la page HTML cache l'utilisateur
<input type="hidden" name="secret" value="Chuuuut !" />

Cookies
Informations textuelles envoyes par un serveur Web un client (navigateur). Lorsquun client reoit un cookie, il le stocke localement et le renvoie ensuite au serveur chaque fois quil accde une page sur ce serveur Paires de 'nom/valeur' changes via les en-ttes HTTP
HTTP/1.1 200 OK ... Set-Cookie: JSESSIONID=50BAB1DB58D5F833D78D9EC1C5A10C5;Path=/myDir GET /myDir/servlet/SessionServlet HTTP/1.1 ... Cookie: JSESSIONID=50BAB1DB58D5F833D78D9EC1C5A10C5

Positionn dans la balise <form> Transmis au serveur lorsque le formulaire est soumis
Note : suivre un lien hypertexte en dehors du formulaire n'envoie pas l'information au serveur

Rcriture d'URL Sauver l'tat dans l'URL http://www.monsite.com/mapage?user=toto Chaque URL est une requte de type "GET" URL parfois longue car elle doit contenir toute l'information lie l'tat
62

Les cookies ont une dure de vie paramtrable Utilisations :


Suivi de session bas sur un identifiant unique Personnalisation de l'application en fonction des choix du client
63

Cookies
Limites :
Ne contiennent que des chanes de caractres Transmis chaque requte => impact sur les performances Dconseills pour une utilisation scurise car la valeur des paramtres est passe en clair dans la requte Le navigateur peut tre paramtr pour les refuser La taille et le nombre des cookies sont limits par le navigateur pour des raisons de scurit

Cookies
Pour les manipuler : javax.servlet.http.Cookie
Cookie(String name, String value) : constructeur String get/setName() : retourne/attribue le nom du cookie String get/setValue() : retourne/attribue la valeur du cookie
caractres non autoriss : espace [ ] ( ) = , " / ? @ : ;

setDomain(String) : assigne le nom du domaine (Gnralement laiss vide car le nom du serveur est assign par dfaut) String get/setPath(String) : retourne/attribue le path o s'applique le cookie get/setMaxAge() : dlai restant avant expiration du cookie (en seconde)
Par dfaut, dure de vie d'un cookie = la connexion courante

64

65

Cookies
En pratique, la servlet :
rcupre les cookies lis l'application dans la requte
Cookie[] HttpServletRequest.getCookies()

Cookies
... protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); 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); c.setMaxAge(60 * 60 * 24 * 365); // 1 an res.addCookie(c); out.println("Bonjour le nouveau"); } else { out.println("Encore vous"); } } out.flush(); out.close(); } 66 67

ajoute un cookie
HttpServletResponse.addCookie(Cookie)

modifie un cookie
ajouter un cookie avec le mme nom et le mme path

supprime un cookie
Cookie.setMaxAge(0) et l'ajouter dans la rponse

Sessions
Les sessions
Permettent de stocker les informations des clients ct serveur et non du ct client Pallient aux limites des cookies : stockage d'objets complexes et pas de limite de taille Attention : elles ne sont pas persistantes et se terminent la dconnexion du client !

Sessions
Manipuler la session partir de HttpSession
setAttribute(String, Object) cration/remplacement d'un attribut Object getAttribute(String) retourne un attribut par son nom removeAttribute(String) supprime un attribut par son nom Enumeration getAttributeNames() retourne le nom de tous les attributs invalidate() invalide lensemble de la session et libre tous les objets qui y sont associs
68 69

Objets de type javax.servlet.http.HttpSession Obtenir une session partir de HttpServletRequest


HttpSession getSession() retourne la session associe lutilisateur HttpSession getSession(false) la session est rcupre ou null si elle n'existait pas dj HttpSession getSession(true) la session est rcupre ou ouverte si elle n'existait pas dj

Sessions
Un compteur de visites au cours d'une mme session
... public class SessionServlet 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."); } }

Sessions : suivi
Il existe 2 moyens de grer les sessions (transparent) :
l'aide de cookies (par dfaut) l'aide re la rcriture d'URL

Cookies
A chaque session cre, le serveur envoie un identificateur (cookie) correspondant au client. Ensuite le client renverra ce cookie au serveur lors de sa prochaine requte permettant ainsi au serveur d'identifier le client => mais les cookies peuvent tre dsactivs !

Rcriture des URLs


Le serveur ajoute l'identificateur de session la fin de chaque URL des pages envoyes par celui-ci Cette technique a un cot pour le serveur : il doit personnifier l'URL en y incluant l'identifiant de session

70

71

Sessions : suivi
Rcriture des URLs
2 mthodes existent pour individualiser les URL:
String HttpServletResponse.encodeRedirectURL(String)
... res.sendRedirect(res.encodeRedirectURL("/servlet/login"); ...

Sessions : web.xml
<session-timeout> : permet de dfinir la dure en minutes pendant laquelle la session d'un utilisateur reste active
... <web-app> ... <session-config> <session-timeout>30</session-timeout> </session-config> </web-app>

web.xml

String HttpServletResponse.encodeURL(String)
... out.println("<A HREF=\"/servlet/toto\">Go</A>"); // remplacer par ... out.print("<A HREF=\"" + res.encodeURL(req.getContextPath() + "/servlet/toto") + "\">Go</A>");

http://localhost:8080/monAppli1/servlet/toto;jsessionid=c0o7fszeb1 Ces mthodes rcrivent l'URL uniquement si le client n'accepte pas les cookies. Dans l'autre cas l'URL reste inchange Limitations des 2 approches : pas de donnes volumineuses, caractres non autoriss, longueur URL, donnes visibles (scurit)
72 73

ServletContext : Partage d'informations


Les servlets d'une mme application peuvent partager des informations au moyen du contexte ( session ! ) Le conteneur de servlet gre un contexte par application Le contexte peut servir communiquer :
de l'information entre servlets d'une mme application (ou non) avec le conteneur de servlet (Obtenir des ressources sur le serveur, crire dans un fichier de log)

ServletContext : Partage d'informations


Partage dinformation inter-applications
Possibilit de partager des informations entre contextes web d'un mme serveur Solution : la Servlet recherche un autre contexte partir de son propre contexte
ServletContext getContext(String uri) : obtient le contexte partir dun chemin URI (chemin absolu)

Le contexte implmente l'interface ServletContext et est accessible par getServletContext() via HttpServlet Partage dinformation inter-servlets :
Enumeration getAttributeNames() retourne lensemble des noms de tous les attributs lis Object getAttribute(String) retourne lobjet sous le nom indiqu void setAttribute(String, Object) lie un objet au nom indiqu void removeAttribute(String) supprime lobjet li sous le nom indiqu
74

Obtenir des ressources de l'application partir du contexte courant


Set getResourcePaths(String) : Liste des chemins partir d'un chemin ("/META-INF/", "/WEB-INF/", etc.) String getRealPath(String) : obtenir le chemin absolu partir d'un chemin relatif de l'application URL getResource(String) InputStream getResourceAsStream(String)
75

ServletContext : Gestion des traces


Produire des logs dans Tomcat (<tomcat>/logs/):
void log(String) void log(String, Throwable)
... public void doGet(...)...{ ... getServletContext().log("A message"); try { // ... } catch (Exception e) { getServletContext().log("An exception occurred", e); } ... ... 2007-10-06 21:12:54 A message 2007-10-06 21:12:54 An exception occurred java.io.IOException at com.master2.MyServlet.doGet(Unknown Source) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

ServletContext : web.xml
Des informations de contexte peuvent tre dfinies dans le descripteur web.xml Ces informations sont accessibles par toutes les servlets de l'application web
String ServletContext.getInitParameter(String)
... <web-app> ... <context-param> <param-name>annee</param-name> <param-value>2007</param-value> <description>une description ...</description> </context-param> </web-app> ...

Servlet

web.xml

Tomcat

76

77

Collaboration de servlets
Les servlets peuvent partager ou dlguer le contrle de la requte Deux types de collaborations :
Dlgation : une Servlet peut renvoyer une requte entire une autre servlet Inclusion : une Servlet peut inclure du contenu gnr par une autre servlet

Collaboration de servlets : redirection


Pour distribuer en dehors du contexte courant, il faut :
Identifier le contexte extrieur : utilisation de getContext(String uri) Utiliser ensuite getRequestDispatcher(String path) Note : les chemins sont uniquement en absolu

Les avantages sont :


Dlgation de comptences Meilleure abstraction et architecture logicielle MVC

Redirection de la requte dune servlet vers une autre ressource sur le serveur Types de redirection :
Effectue par le serveur sur le mme serveur void RequestDispatcher.forward(ServletRequest, ServletResponse) Effectue par le serveur sur un autre serveur void RequestDispatcher.sendRedirect(String)

Interface grant la collaboration : javax.servlet.RequestDispatcher Une instance de RequestDispatcher est obtenue :


Sur la requte : getRequestDispatcher(String path)
path est le chemin relatif ou absolu d'une ressource (servlet, JSP, fichier statique, ) ne pouvant pas sortir du contexte courant
78

Possibilit de transmettre des informations lors de la redirection


en utilisant les attributs de requte via la mthode setAttribute(...) en attachant des paramtres lURL
79

Collaboration de servlets : redirection


Illustration de redirection interne
public class Emetteur extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req.setAttribute("nom", "toto"); // getAttribute(...) pour // retrouver la valeur RequestDispatcher disp = req.getRequestDispatcher("/recepteur.do?age=22"); disp.forward(req, res); // Ne rien faire sur req et res } }

Collaboration de servlets : redirection


Illustration de redirection externe : alternative 1 : redirection diffre du client vers une autre URL
... public class ClientMove extends HttpServlet { static final String NEW_HOST = "http://www.newhost.com"; public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); String newLocation = NEW_HOST + req.getRequestURI(); res.setHeader("Refresh", "5; URL=" + newLocation); out.println("Changement d'URL : <A HREF=\""); out.println(NEW_HOST+ "\">"+ NEW_HOST +"</A><BR>"); out.println("Vous serez redirig dans 5 secondes..."); } ... }

public class Recepteur extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); out.println(req.getParameter("age")); // chane de caractres out.println(req.getAttribute("nom")); // objet } } 80

Illustration de redirection externe : alternative 2 : redirection immdiate du client vers une autre URL :
sendRedirect(String)
81

Collaboration de servlets : inclusion


Inclusion du contenu dune ressource dans la rponse courante (Jsp, servlet, fichier texte ...)
void RequestDispatcher.include( ServletRequest req, ServletResponse res)

Collaboration de servlets : inclusion


public class Regroupage 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("/inclus.do"); dispat.include(req,res); out.println("<BR />"); req.setAttribute("bonjour", "Bonjour"); dispat.include(req,res); out.println("<BR />"); req.setAttribute("bonsoir", "Bonsoir"); dispat.include(req,res); out.println("<BR />"); out.println("</BODY></HTML>"); } } public class Inclus 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"); } } }

La diffrence avec une redirection 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 l'inclusion


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

83

Servlet et Thread
Une servlet ne possde qu'une seule instance (singleton) qui est attaque par plusieurs threads la fois (1 thread / client) Problmes :
Plusieurs threads peuvent traverser la mthode service() en mme temps => ne sont pas thread safe ni les variables d'instance, les contextes, les sessions
Cas d'un client qui clique plusieurs fois sur un bouton "submit", ouvre plusieurs navigateurs, etc.

Servlet et Thread
Solution 1 : utilisation de synchronized
public class MyThread extends HttpServlet { private int i = 0; public void doGet(){ synchronized(this) { int tmp = ++i; } public class MyThread extends HttpServlet { public void doGet(){ User user = new User(); HttpSession session = req.getSession(true); synchronized(session) { session.setAttribute("user", user); } Les variables doivent tre locales aux mthodes Les attributs de classes ne peuvent tre que de constantes de configuration initialises dans la mthode init()
84 85

En gnral :

Accs concurrents sur une ressource : modification dun fichier commun, etc.

Servlet et Thread
Solution 2 :
Utiliser linterface SingleThreadModel implmente par la servlet qui permet dindiquer au moteur de servlets que lon souhaite quune instance de la servlet ne soit attaque que par un Thread la fois
Cette interface ne comporte aucune mthode implmenter, elle ne reprsente quun drapeau pour le moteur de servlet

web.xml : Gestion des erreurs


... <web-app> web.xml ... <servlet-mapping> <servlet-name>ErrorServlet</servlet-name> <url-pattern>/servletErr</url-pattern> </servlet-mapping> ... <error-page> <exception-type>javax.servlet.ServletException</exception-type > <location>/servletErr</location> </error-page> <error-page> <error-code>403</error-code> <location>/errorpages/error403.jsp</location> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type > <location>/errorpages/error403.jsp</location> </error-page> ...

86

87

web.xml : Filtres
API javax.servlet.Filter Permet de consulter et transformer les en-ttes et le contenu des requtes et des rponses Traitement sinterposant entre le client et la ressource requise (Servlet, JSP, fichier) Chanage de filtres selon lordre de dclaration dans web.xml Exemple de filtres
Authentification, blocage des adresses IP Conversion (Image), Transformation (XSLT) Chiffrage, Compression Log, ...
88

web.xml : Filtres
... <filter> <filter-name>LogFilter</filter-name> <display-name>LogFilter</display-name> <description>envoie des logs</description> <filter-class>myapp.filters.LogFilter</filter-class> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/unPath/*</url-pattern> </filter-mapping> http://localhost:8080/appli/unPath ... public class LogFilter implements javax.servlet.Filter { private FilterConfig config; public void init(FilterConfig fc) throws ServletException { config = fc; } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { config.getServletContext().log( "Request received from: " + req.getRemoteHost()); chain.doFilter(req, res); } public void destroy() { } }

Web.xml

Filtre

89

web.xml : Accs des paramtres


... <env-entry> <env-entry-name>nom</env-entry-name> <env-entry-value>toto</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry> ... ... Context ctx = new InitialContext(); String value = (String) ctx.lookup("java:/comp/env/nom"); ...

web.xml : Autres fonctionnalits


Web.xml permet galement de paramtrer :
Observateurs de session : ragir face des vnements intervenants dans la session Mapping de types MIME : lorsque des fichiers sont envoys au client, Tomcat gnre automatiquement un en-tte "Content-Type" pour les types dfinis dans le descriteur Rfrences d'EJB Configuration des sources de donnes (appels JNDI) Configuration de la JSP et des tags JSP ( voir) Contraintes de scurit ( voir) etc.
90 91

Web.xml

Servlet

Centralisation de paramtres dans le fichier web.xml accessibles aux servlets de l'application Illustration : paramtres d'accs une base de donnes

Вам также может понравиться