Академический Документы
Профессиональный Документы
Культура Документы
SERVLET (2/2)
Solutions =
les champs cachs la rcriture d'URLs les cookies les sessions
60 61
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
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
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 !
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
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
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
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)
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
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
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
Servlet
Centralisation de paramtres dans le fichier web.xml accessibles aux servlets de l'application Illustration : paramtres d'accs une base de donnes