III. L environnement Web Miage FC/A 2008 1
Au sommaire 1. Introduction 2. URL 3. HTTP 4. CGI 5. Servlets Miage FC/A 2008 2
1. Introduction WWW : World Wide Web 1989 - Tim Berners-Lee Mise en ligne de documentation (scientifique) Les concepts : Hypertexte : HTML Client/serveur : HTTP schéma de désignation : URL Miage FC/A 2008 3
1. Introduction Hypertexte Texte classique organisation linéaire avec index, sommaire, glossaire, notes, Hypertexte organisation non linéaire (hiérarchique, graphe, ) texte enrichi de liens renvoi vers un document renvoi vers une partie d un document Miage FC/A 2008 4
1. Introduction Client/Serveur Client : le navigateur (Internet Explorer, Netscape), Serveur : le serveur Web (Apache, Microsoft IIS) Le protocole : HTTP Le client émet la requête Le serveur répond en fournissant le document demandé ou un message d erreur Miage FC/A 2008 5
1. Introduction Schéma de désignation Uniform Resource Locator (URL) : désigne une page Web Chaque page a un nom unique => pas d ambiguïté possible protocole://serveur/page http://www.lifl.fr/index.html Organisation hiérarchique des pages protocole://serveur/repertoire/page?requête Miage FC/A 2008 6
1. Introduction Standards HTTP 0.9 : version de base avec requête/réponse 1.0 : version standardisée IETF (RFC 1945) 1.1 : version étendue (connexions persistantes) (RFC 2068) HTML 1.0 version initiale 2.0 version standardisée W3C 3.0 version étendue (tableaux, images cliquables, applets) 4.0 version étendue (frames, feuilles de styles) XML 1.0 URL format stable depuis 1989 Miage FC/A 2008 7
1. Introduction Bibliographie très nombreuse recherche sur moteur amazon.com : sur HTML 96 livres en français, 228 en anglais Sélection Webmaster in a Nutshell, S. Spainhour, R. Eckstein, 2eme édition, O Reilly couvre HTML, CCS, XML, XSL, JavaScript, CGI, PHP, HTTP, Apache Programmation Java côté serveur, A. Patzer, Eyrolles, Couvre Servlets, JSP, EJB. Miage FC/A 2008 8
2. URL URL dans sa forme générale : protocole"://"[utilisateur[":"motdepasse]@](nom adresse) [:port]["/"chemin]["/"nomdefichier][#ancrelocale][?options] Le format complet dans les RFC 1738 et 1808 http://www.w3.org/addressing/ Exemple : http://www.imag.fr/equipe/sirac/projet.html ftp://user:foo@research.digital.com/personal/latex.sty http://123.87.54.251/index.html http://www.altavista.com/query.html?lille+dess http://xenon.inria.fr:8080/hello.html http://alken.lifl.fr/index.html#annuaire Miage FC/A 2008 9
3. Le protocole HTTP http: hypertext transfer protocol Modèle client/serveur client: navigateur qui demande, reçoit et affiche des objets Web serveur: envoie des objets web en réponse aux requêtes http1.0: RFC 1945 http1.1: RFC 2068 PC avec Explorer Mac avec Navigator http request http response http request http response Server avec NCSA Web server 10
Le protocole HTTP http: service de transport Le client initie la connexion TCP (création d une socket) vers le serveur sur le port 80 Le serveur accepte le connexion TCP venant du cleint Des messages http sont échangés entre navigateur (client http) et serveur Web (serveur http) La connexion TCP est fermée http est sans état Le serveur ne maintient aucune information sur les requêtes précédentes du client Les protocoles qui gèrent un état sont complexes! L histoire passée (état) doit être maintenue Si le client/serveur tombe, leurs vues de l état peuvent être incohérentes, et doivent donc être réconciliées 11
time Exemple HTTP Supposons un utilisateur qui entre l URL www.uneuniversite.edu/undepartement/home.index 1a. Le client http initie la connexion TCP vers le serveur http (processus) sur le port 80 de www.uneuniversite.edu 2. Le client http envoie une requête http (contenant l URL) sur la socket de connexion TCP 12 (contient texte &, references à 10 Images jpeg) 1b. Le serveur http sur l hôte www.someschool.edu attend des connexions sur le port 80 de TCP. Il accepte la connexion, et notifie le client 3. Le serveur http reçoit la requête, construit un message de réponse contenant l objet demandé (UneUniversité/home.index), envoie le message sur la socket
Exemple HTTP (cont.) temps 5. -Le client http reçoit le message de réponse contenant le fichier html. - Il analyse (parse) le fichier html reçu, affiche le html. En parsant le fichier html, il trouve 10 objets jpeg référencés 4. Le serveur htto ferme la connexion TCP. 6. Les étapes 1-5 sont répétées pour chacun des dix objets jpeg 13
Connexions Non-persistantes, persistantes Non-persistante http/1.0: le serveur traite la requête, répond et ferme la connexion TCP 2 échanges pour retrouver un objet Une connexion TCP Une requête/un transfert d objet Chaque transfert souffre du ralentissement dû à l ouverture de connexion TCP Beaucoup de navigateurs ouvrent de multiples connexions en parallèle Persistante Par defaut pou http/1.1 Sur la même connexion TCP le serveur traite la requête, répond, traite de nouvelles requêtes, Le client envoie les requêtes pour tous les objets référencés aussi vite que possible dès qu il reçoit le code HTML de base Moins de connexions, moins lent à démarrer 14
Format de message HTTP : requête deux types de messages http : requête, réponse requête http : ASCII (format lisible par l humain) Ligne de requête (commandes GET, POST, HEAD) Lignes d entêtes Retour chariot, line feed indique la fin de message GET /somedir/page.html HTTP/1.0 User-agent: Mozilla/4.0 Accept: text/html, image/gif,image/jpeg Accept-language:fr (extra carriage return, line feed) 15
Requête HTTP : format général 16
Format message HTTP : réponse Ligne état (code état protocole Phrase état) Lignes Entête données, e.g., Fichier html demandé HTTP/1.0 200 OK Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 22 Jun 1998... Content-Length: 6821 Content-Type: text/html data data data data data... 17
Code d état des réponses HTTP La première ligne dans le message de réponse serveur-> client Quelques exemples de code : 200 OK Requête traitée avec succès, L objet suit dans le message 301 Moved Permanently L objet demandé a bougé, la nouvelle localisation est donnée à plus loin dans le message (Location 400 Bad Request La requête n est pas comprise par le serveur 404 Not Found Le document demandé n est pas sur ce serveur 505 HTTP Version Not Supported 18
Contenu des requêtes Version simple : méthode ressource version_du_protocole Exemple : GET /hypertext/theproject.html HTTP/1.0 Types de méthodes pour HTTP/1.0 GET demande d'un document HEAD demande seulement l'en-tête d'un document POST envoi des informations au serveur GET : requête fondamentale HEAD permet de connaître la date de modification d'un document, la taille d'un document, le type du document, le type du serveur POST sert pour l'interrogation de programmes, services réseaux comme l'envoi de messages dans les forums de discussion, l'annotation de documents sur le serveur, l'interrogation de base de données 19
Essayez HTTP (côté client) 1. Telnet avec votre serveur favori : telnet www.lifl.fr 80 Ouvre une connexion sur le port TCP 80 de www.lifl.fr. 2. Envoyez une requête http GET: GET /~duchien/index.html HTTP/1.0 Avec deux retour chariot, vous envoyez une requête GET minimale vers le serveur 3. Regardez le message de réponse envoyé par le serveur http 20
Interaction utilisateur-serveur : authentification Authentification : contrôle d accès au contenu du serveur Les crédits d autorisation : noms, mots de passe Sans état: le client doit présenter son autorisation à chaque requête autorisation: lignes d entête dans chaque requête Si non autorisation: le serveur refuse l accès, et envoie WWW authenticate: Ligne d entête dans la réponse client requête http classique 401: authorization req. WWW authenticate: Msg requête http msg + Authorization: <cred> réponse http classique Msg requête http msg + Authorization: <cred> réponse http classique serveur temps 21
Cookies : garder un état # généré par le serveur, # à rappeller au serveur, utilisé plus tard pour: authentification Se souvenir des préférences utilisateurs, de ses choix Le serveur envoie le cookie au client dans la réponse Set-cookie: 1678453 Le client présente le cookie dans ses futures requêtes cookie: 1678453 client http request http réponse + Set-cookie: # http request cookie: # http réponse http request cookie: # http réponse serveur Action cookiespécifique Action cookiespécifique 22
GET conditionnel: un cache côté client Objectif: ne pas envoyer client d objet si le client a une version à jour dans son cache client: donne la date de la copie cachée dans la requête If-modified-since: <date> serveur: la réponse ne contient aucun object si la copie cachée est à jour HTTP/1.0 304 Not Modified 23 http request If-modified-since: <date> http réponse HTTP/1.0 304 Not Modified http request If-modified-since: <date> http réponse HTTP/1.1 200 OK <data> serveur object non modifiée object modifié
Caches Web (serveurs proxy) Objectif: satisfaire la requête du client sans interroger le serveur d origine L utilisateur paramètre son navigateur: accès aue web via le cache web Proxy Le client envoie toutes les server requêtes http vers le cache client web Le cache web retourne l objet sinon le cache web cache demande l objet au serveur d origine, qui retourne l objet au client client http request http response http request http response http request http response Serveur origine Serveur origine 24
Pourquoi gérer des caches dans le Web? Le cache est prêt du client (e.g., sur le même réseau) Le temps de réponse est plus petit: cache prêt du client Fait décroître le trafic vers les serveurs distants Le lien entre le réseau local et le reste du monde est souvent un goulet d étranglement Réseau institutionnel public Internet 1.5 Mbps access link 10 Mbps LAN Serveurs origines Cache intitutionnel 25
4. CGI Multiples systèmes de script : CGI, servlet, ASP, JSP, XSP, Ces systèmes permettent au client de faire exécuter un programme au serveur Common Gateway Interface (CGI) : Protocole entre un serveur Web et des programmes à lancer côté serveur Les programmes peuvent être - interprétés : shells scripts sh, csh, ksh, shells Perl, etc - compilés : programmes C, C++, Ada, etc Exemples d'utilisation traitement des données saisies dans un formulaire génération automatique de pages Web compteur pour afficher le nombre d'accès à la page 26
Fonctionnement CGI Les scripts sont désignés par une URL (comme les documents HTML) Par exemple : http://www.lifl.fr/cgi-bin/anniversaire.pl En fonction du chemin d'accès, le serveur sait si l'url correspond à un script ou à un document Par convention, tous les fichiers dans le répertoire cgibin/ sont des scripts 27
Fonctionnement CGI Etape 1 : client -> serveur 2 méthodes peuvent être employées : GET ou POST GET /cgi-bin/anniversaire.pl?mois=aout&jour=11 HTTP/1.0 Les options à passer au script sont encodées après le? Elles sont facultatives POST /cgi-bin/anniversaire.pl HTTP/1.0 Content-type: application/x-www-form-urlencoded Content-length: 20 mois=aout&jour=11 Rq : dans ce cas (formulaire), c'est le navigateur qui construit cette requête 28
Fonctionnement CGI Etape 2 : serveur -> script Les informations à passer aux scripts CGI par le serveur Web le sont soit par des variables d'environnement soit sur l'entrée standard du script Les principales variables d'environnement CONTENT_TYPE, CONTENT_LENGTH, etc (ce sont les champs de l'en-tête du message) SCRIPT_NAME (ici /cgi-bin/anniversaire.pl) Les options d'appel de script (ici mois=aout&jour=11) sont transmises par la requête d'environnement QUERY_STRING pour la méthode GET sur l'entrée standard du script pour la méthode POST Le script analyse ses variables (et l'entrée standard éventuellement), exécute son traitement et produit un résultat 29
Fonctionnement CGI Etape 3 : script -> serveur La sortie standard du script est un document de la forme en-tête ligne blanche données 3 en-têtes possibles Content-type: (par ex text/html ou image/gif) Location: (par ex http://www.truc.com) : C'est une URL à transmettre au client Status: (par ex 403 Forbidden) : C'est un code (d'erreur) à renvoyer au client Etape 4 : serveur -> client Le document est envoyé au navigateur Web qui l'interprète 30
Exemples Shell script sh #!/bin/sh echo "Content-type: text/html" echo echo "<!DOCTYPE HTML PUBLIC \"-//W3C/DTD HTML 3.2 Final/EN\">" echo "<HTML>" echo "<BODY>" echo "Nous sommes le <B>"`date`"</ B>" echo "</BODY>" echo "</HTML>" Langage C #include <stdio.h> main() { char c; int nb_args; printf( "Content-type: text/html\n"); printf( "\n" ); printf( "<! DOCTYPE HTML PUBLIC \"-//W3C/DTD HTML 3.2 Final/EN\">\n" ); printf( "<HTML>\n" ); printf( "<BODY>\n" ); nb_args = 0; while ((c=getchar())!= EOF) if ( c == '&' ) nb_args++; if ( nb_args!= 0 ) nb_args++; printf( "Il y a %d arguments a votre requete\n", nb_args ); printf( "</BODY>\n" ); printf( "</HTML>\n" ); } 31
5. Servlet Programme Java s'exécutant côté serveur Web servlet prog. "autonome" stockés dans un fichier.class sur le serveur JSP prog. source Java embarqué dans une page.html Servlet et JSP exécutable avec tous les serveurs Web (Apache, IIS,...) auxquels on a ajouté un "moteur" de servlet/ JSP (le plus connu : Tomcat ) JSP compilées automatiquement en servlet par le moteur.class autonome Embarqué dans HTML Côté client Applet JavaScript Côté serveur Servlet JSP 32
5. Servlet Scripts serveur écrit en Java Différent avec les CGI et les LD (NSAPI, ISAPI) - performance sur les passages des paramètres (vs CGI) - sûreté de fonctionnement (NSAPI, ISAPI) Servlets de Base : FileServlet, CGIServlet, Téléchargement et exécution d une Servlet «externe» exécution dans un espace protégé ou non Serveurs Server HTTPD écrits en Java : Sun Java Web Server, W3C Jigsaw mais aussi Netscape, Oreilly, Apache (mod_jserv),... servletrunner (JSDK), Développement - JSDK (servletrunner) - IBM VisualAge (visual servlet) 33
Servlet Principe les fichiers de bytecode (.class ) sont stockés sur le serveur (comme des docs) par convention dans le répertoire servlet/ ils sont désignés par une URL http:// www. lifl. fr/ servlet/ Prog le chargement de l'url provoque l'exécution de la servlet 1 2 Client Serveur Tom Prog. class 4 cat 3 Explorer IIS Netscape Apache Sun JVM Microsoft 34
Mécanismes de base écriture d'une servlet = écriture d'une classe Java - Lors du premier chargement d'une servlet (ou après modification), le moteur instancie la servlet servlet = objet Java présent dans le moteur - puis, ou lors des chargements suivants, le moteur exécute le code dans une thread - le code produit un résultat qui est envoyé au client en cas d'erreur dans le code Java de la servlet, message récupéré dans le navigateur 35
Développement Utilisation des packages Java javax.servlet.* et javax.servlet. http.* extension de la classe javax.servlet.http.httpservlet redéfinition de la méthode service de cette classe définit le code à exécuter lorsque la servlet est invoquée elle est appelée automatiquement par le "moteur«de servlet void service(servletrequest request,servletresponse response ); représente la requête envoyée par le client renseigné automatiquement par le "moteur" 36 représente la réponse retournée par la servlet à renseigner dans le code de la servlet
Mode d invocation Direct (depuis un document ou un browser) http://machine-name:port/servlet/servlet-name http://localhost:8080/servlet/bookdetails?bookid=203 Depuis une autre servlet BookDBServlet database = (BookDBServlet) this.getservletconfig().getservletcontext().getservlet("bookdb"); BookDetails bd = database.getbookdetails(bookid); SSI <SERVLET NAME="Date"> <PARAM NAME="TimeZone"VALUE ="Paris" > </SERVLET> JSP (Java Server Page) 37
Aperçu de l API servlet Méthodes appelables sur un objet request - String getparameter(string param) retourne la valeur du champ param transmis dans les données du formulaire - java.util. Enumeration getparameternames() retourne l'ensemble des noms de paramètres transmis à la servlet - String getmethod() retourne la méthode HTTP (GET ou POST) utilisée pour invoquer la servlet Méthodes appelables sur un objet response - void setcontenttype( String type) définit le type MIME du document retourné par la servlet - PrintWriter getwriter() retourne un flux de sortie permettant à la servlet de produire son résultat la servlet "print " le code HTML sur ce flux de sortie 38
Exemple de servlet imposé imposé par l API servlet ce qui suit est en HTML récupère un flux pour générer le résultat énération du code HTML import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HelloServlet extends HttpServlet { public void service(servletrequest request,servletresponse response ) throws ServletException,IOException { response.setcontenttype("text/html"); } PrintWriter out =response.getwriter(); out.println("<html><body>"); out.println("<h1>hello depuis une servlet</h1>"); out.println("</body></html>"); } 39
Exemple de servlet (cont.) Compilation HelloServlet. Class installé dans l'arborescence de Tomcat Chargement via une URL de type http://.../ servlet/ HelloServlet => exécution de HelloServlet. class 40
Exemple 2 de servlet Chaque servlet n'est instanciée qu 1 seule fois persistance de ces données entre 2 invocations public class CompteurServlet extends HttpServlet { int compteur =0; public void service( ServletRequest request, ServletResponse response ) throws ServletException, IOException { response. setcontenttype("text/html"); PrintWriter out =response.getwriter(); out.println("<html><body>"); out.println("<h1>«+ compteur++ +"</h1>"); out.println("</body></html>«); } } 1ère invocation -> 0 2ème invocation ->1 41
Récupération des données dans un formulaire Méthode String getparameter( String) d'un objet request =>retourne le texte saisi =>ou null si le nom de paramètre n'existe pas <HTML> <BODY> <FORM ACTION=«http://..."METHOD=POST> Nom <INPUT NAME="nom"><P> Prénom <INPUT NAME="prenom"><P> <INPUT TYPE=SUBMIT VALUE="Envoi"> <INPUT TYPE=RESET VALUE="Remise à zéro"> </FORM> </BODY> </HTML> 42
Récupération des données dans un formulaire (cont.) public class CompteurServlet extends HttpServlet { public void service(servletrequest request,servletresponse response ) throws ServletException,IOException { response.setcontenttype("text/html"); PrintWriter out =response.getwriter(); String nom =request.getparameter("nom"); String prenom =request.getparameter("prenom"); out.println("<html><body>"); out.println("<h1>exemple de résultat</h1>"); out.println("bonjour "+prenom+""+nom); out.println("</body></html>"); } } 43
Cycle de vie d une servlet void init(servletconfig conf) méthode appelée par le moteur au démarrage de la servlet peut être utilisée pour initialiser la servlet propager l'initialisation par super. init(conf) ne jamais utiliser de constructeur void destroy() lorsque l'on veut détruire la servlet Différenciation des méthodes HTTP service() traite toutes les requêtes HTTP doget(),doput(),dopost(),doput(),dodelete() peuvent être redéfinies pour traiter chaque requête HTTPde façon différenciée 44 GenericServlet init() destroy() HttpServlet service() doget() doput() MyServlet
Chaînage des servlets Servlet 4 Aggrégation des résultats fournis par plusieurs servlets =>meilleure modularité =>meilleure réutilisation servlet Servlet 1 Servlet 2 Servlet 5 Utilisation d'unrequestdispatcher obtenu via un objetrequest RequestDispatcher rd =request.getrequestdispatcher("servlet1«); Inclusion du résultat d'une autre servlet rd.include(request,response); Délégationdu traitement à une autre servlet rd.forward(request,response); Servlet 3 URL 45
Compléments sur l API Méthodes appelables sur un objet request - String getprotocol() retourne le protocole implanté par le serveur (ex.:http/1.1) - String getservername()/string getserverport() retourne le nom/port de la machine serveur - String getremoteaddr()/string getremotehost() retourne l'adresse/nom de la machine cliente (ayant invoqué la servlet) - String getscheme() retourne le protocole utilisé (ex.:http ou https)par le client - java.io.bufferedreader getreader() retourne un flux d'entrée permettant à une servlet chainée de récupérer le résultat produit par la servlet précédente => permet à la servlet chaînée de modifier le résultat 46
Gestion de la concurrence Par défaut les servlets sont exécutées de façon multi-threadée Si une servlet doit être exécutée en exclusion mutuelle (ex.:accès à des ressources partagées critiques) implantation de l'interface marqueur SingleThreadModel public class CompteurServlet extends HttpServlet implements SingleThreadModel { public void service(servletrequest request,servletresponse response ) throws ServletException,IOException { /**Du code en exclusion mutuelle avec lui-même */ } } Autre solution : définir du code synchronized dans la servlet 47
Cookie Permet à un serveur Web de stocker de l'information chez un client moyen pour savoir "par où passe"un client,quand,en venant d'où,... débat éthique?? l'utilisateur a la possibilité d'interdire leur dépôt dans son navigateur définis dans la classe javax.servlet.http.cookie on les crée en donnant un nom (String) et une valeur (String) Cookie unecookie =new Cookie("sonNom","saValeur"); on les positionne via un objet response response.addcookie(unecookie ); on les récupère via un objet request Cookie[]desCookies =request.getcookies(); Quelques méthodes :String getname()/string getvalue() 48
Suivi de session HTTP protocole non connecté pour le serveur,2 requêtes successives d'un même client sont indépendantes Objectif : être capable de "suivre«l'activité du client sur +sieurs pages Notion de session => les requêtes provenant d'un utilisateur sont associées à une même session => les sessions ne sont pas éternelles, elles expirent au bout d'un délai fixé Sur un objet request -HttpSession session =request.getsession(true) retourne la session courante pour cet utilisateur ou une nouvelle session - HttpSession session =request.getsession(false) retourne la session courante pour cet utilisateur ou null 49
Suivi de session Méthodes appelables sur un objet de type HttpSession -void setattribute(string name,object value ) ajoute un couple (name,value) pour cette session -Object getattribute(string name ) retourne l'objet associé à la clé name ou null -void removeattribute(string name ) enlève le couple de clé (name,value) -java.util.enumeration getattributenames() retourne tous les noms d'attributs associés à la session -void setmaxintervaltime(int seconds ) spécifie la durée de vie maximum d'une session -long getcreationtime()/long getlastaccessedtime() retourne la date de création /de dernier accès de la session en ms depuis le 1/1/1970,00h00 GMT new Date(long) 50
Partage de données entre servlets Notion de contexte d'exécution =ensemble de couples (name,value)partagées par toutes les servlets instanciées ServletContext ctx =getservletcontext()(héritée de GenericServlet) Méthodes appelables sur un objet de typeservletcontext -void setattribute(string name,object value ) ajoute un couple (name,value) dans le contexte -Object getattribute(string name ) retourne l'objet associé à la clé name ou null - void removeattribute(string name ) enlève le couple de clé name - java.util.enumeration getattributenames() retourne tous les noms d'attributs associés au contexte 51
Conclusion servlet Permettent d'étendre le comportement des serveurs Web avec des prog. Java Résumé des fonctionnalités +portabilité,facilité d'écriture (Java) +gestion des applications requiérant un suivi entre plusieurs programmes (persistance des données dans les servlets) +servlet chargée et instanciée une seule fois +servlet exécutée avec des processus légers (threads) 52
Moteurs de servlet Jakarta/Tomcat (jakarta.apache.org) RESIN (www.caucho.com). Bibliographie J. Hunter with W. Crawford «Java Servlet Programming», 1st edition, nov 98, ed O Reilly C. Taylor, T.Kimmett «Core Java Web server», nov 98, Ed Prentice Hall Tutorial Java de Sun sur les servlet De nombreux sites proposent les sources de Servlet http:// www.servlet.com 53