Applications WEB à base de Servlets
Transcription
Applications WEB à base de Servlets
Introduction – Applications Web Applications WEB à base de Servlets Computer 1 Computer 2 2. request processing Vania Marangozova-Martin Web client Web server [email protected] 1. 3. Web response request Communication system ibd.forge.imag.fr V.Marangozova-Martin Côté serveur Le serveur peut servir des demandes de documents statiques ou alors générer des pages à la volée " ! 2 CGI = Common Gateway Interface ! ! IBD Fournit une interface standard entre le serveur web et les programmes de génération de contenu web Programmes de traitement/génération côté serveur Utilité des pages web construites dynamiquement " Le contenu peut dépendre des données envoyées par le client # " " Exemples: resultats de moteurs de recherche, commerce électronique et gestion des commandes Les données évoluent # Exemples: les news La page web utilise des données de sources externes # Examples: magasin en ligne qui affiche les prix des articles, les prix étant dans la BD de gestion de stock V.Marangozova-Martin IBD 3 V.Marangozova-Martin IBD 4 Exemple simple de programme CGI Problèmes avec CGI ! Pour " #!/usr/bin/perl -wT print "Content-type: text/html\n\n"; print "<html><head><title>Hello World</title></head>\n"; print "<body>\n"; print "<h2>Hello, world!</h2>\n"; print "</body></html>\n"; " ! Si N requêtes demandent à exécuter le même programme CGI " V.Marangozova-Martin IBD 5 Alternatives à CGI V.Marangozova-Martin ! ! pool de processus qui vont servir plusieurs requêtes " " 6 Efficacité " propriétaires aux serveurs web ! " ! " 7 Les servlets héritent de la portabilité de Java Peuvent s’exécuter donc sur différents serveurs web (ex. Apache Tomcat, IBM’s WebSphere Application Server, BEA WebLogic Application Server, etc.) Avantages " IBD Contrairement à CGI, chaque requête HTTP est traitée par un thread (dans la JVM) et non par un process Pour N requêtes sur le même traitement, N threads mais une seule copie du code Portabilité " plug-ins, modules,… servlets V.Marangozova-Martin IBD Le servlets sont des programmes Java qui s’exécutent sur un serveur " ! SCGI ! Mécanismes N copies du programme sont chargées en mémoire Les Servlets ! FastCGI " chaque requête HTTP nouveau processus coût de création et en mémoire Gestion des sessions utilisateur Gestion des connexions à la BD V.Marangozova-Martin IBD 8 Servlet dans Java API (2) Servlet dans Java API ! http://docs.oracle.com/javaee/7/api/ Servlet Server GenericServlet subclass request response service ( ) “service” method is the GenericServlet’s entry point Implemented by subclass V.Marangozova-Martin IBD 9 Un servlet HTTP javax.servlet.http.HTTPServlet V.Marangozova-Martin IBD 10 Cycle de vie d’un servlet A typical servlet life cycle time HttpServlet subclass HTTP (i.e. web) and Servlet server init GET request response doGet ( ) service service service service service service service ( ) POST request response service doPost ( ) service “doGet” method is the HttpServlet’s entry point for GET requests destroy “doPost” method is the HttpServlet’s entry point for POST requests thread 1 Implemented by subclass V.Marangozova-Martin IBD 11 V.Marangozova-Martin thread 2 thread 3 IBD 12 Cycle de vie (2) javax.servlet.Servlet ! Pour " " 3 " ! 2 # IBD 13 Cycle de vie (3) ! Méthode " " # " " IBD ! Génération <HTML> <HEAD> <TITLE> Hello World </TITLE> </HEAD> destroy <BODY> <BIG> p.ex mise à jour Hello World Doit prendre en compte le fait que des exécutions de service peuvent être en cours Doit libérer les ressources allouées dans init apelée une seule fois V.Marangozova-Martin 14 d’une page web simple Utilisée quand le servlet doit être désactivé # " V.Marangozova-Martin plusiurs threads qui l’exécutent devrait être implémentée de manière sécurisée (thread-safe) ! Méthode " qui contient des paramètres et une référence vers ServletContext Exemple (1) service appelée pour chaque requête Peut être appelée de manière concurrente # init(ServletConfig config) appelée qu’une seule fois " initialise et sauvagarde l’objet ServletConfig " 1 V.Marangozova-Martin initialiser un servlet, le serveur de servlets charge la classe crée une instance avec un constructeur sans arguments appelle la méthode init(ServletConfig config) IBD </BIG> </BODY> </HTML> 15 V.Marangozova-Martin IBD 16 Exemple (2) Exemple 2 : Formulaire HTML import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType(“text/html”); PrintWriter out = res.getWriter(); out.println(“<HTML>”); out.println(“<HEAD> <TITLE> Hello World </TITLE> </HEAD>”); out.println(“<BODY> <BIG> Hello World </BIG> </BODY>”); out.println(“</HTML>”); out.close(); } } V.Marangozova-Martin IBD 17 V.Marangozova-Martin 18 Récupération d’information des requêtes Le source HTML <HTML> ! Les requêtes implementent l’interface ServletRequest ! Fournit des méthodes pour accéder à de l’information, comme <HEAD> <TITLE> Introductions </TITLE> </HEAD> " <BODY> <FORM METHOD=GET ACTION="servlet/HelloWorldServlet" > If you don't mind me asking, what is your name? <INPUT TYPE=TEXT NAME="name"> <P> <INPUT TYPE=SUBMIT> </ FORM> </BODY> " " returns the name and version of the protocol the request uses String getRemoteAddr(): # 19 returns the value of a request parameter as a String, or null if the parameter does not exist String getProtocol(): # " IBD String getParameter(String name): # </HTML> V.Marangozova-Martin IBD returns the Internet Protocol (IP) address of the client that sent the request etc. V.Marangozova-Martin IBD 20 Example 3 A simple HTTP Servlet handling a form import java.io.*; import javax.servlet.*; import javax.servlet.http.*; ! ! public class HelloWorldServlet extends HttpServlet { ! public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { public class BookInfoServlet extends HttpServlet { res.setContentType(“text/html”); PrintWriter out = res.getWriter(); String name = req.getParameter(“name”); out.println(“<HTML>”); out.println(“<HEAD> <TITLE> Hello,” + name + “</TITLE></HEAD>”); out.println(“<BODY>”); out.println(“Hello, ” + name); out.println(“</BODY>”); out.println(“</HTML>”); out.close(); public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ... String bookId = req.getParameter("bookId"); if (bookId != null) { // Retrieve information about that book ... } ... } ... } } A customer wishes to get information about a book. He calls BookInfoServlet and includes the identifier of the book in his request For example: http://host:port/servlets/BookInfoServlet?bookId=1234 } V.Marangozova-Martin IBD 21 V.Marangozova-Martin IBD Authentication L’authentication en général (2) ! Objectif ! " " Gérer l’accès aux ressources web Différencier les droits des utilisateurs # ! ex. Seulement les abonnés au Monde peuvent lire les articles complets ! La première fois que le client contacte un serveur, le serveur répond qu’il a besoin d’authentifier l’utilisateur Quand le navigateur reçoit cette réponse, il ouvre une fenêtre de dialogue (name+password) L’utilisateur renseigne les informations demandées, le navigateur renvoie la requête " ! Principes " " ! Les serveurs HTTP ont la fonctionnalité d’authentification Les détails de mise en place dépendent du serveur V.Marangozova-Martin IBD ! 23 22 En y attachant les informations name+password Si le serveur accepte les informations fournies, il effectue la requête Sinon, il refuse l’accès à la ressource V.Marangozova-Martin IBD 24 Deployer les servlets avec des droits (integré) Servlets et authentication ! L’authentification " # " des servlets peut reposer sur de fonctionnalités integrées https://tomcat.apache.org/tomcat-7.0-doc/realmhowto.html#Configuring_a_Realm ou être implémentée de manière applicative V.Marangozova-Martin IBD 25 Fonctions disponibles (integré) V.Marangozova-Martin IBD 26 Authentification programmée String userName = request.getParameter("txtUserName"); String password = request.getParameter("txtPassword"); out.println("getRemoteUser?.." + request.getRemoteUser()+"<br>"); … request.login(userName, password); … //do some work … request.logout(); V.Marangozova-Martin IBD 27 V.Marangozova-Martin IBD 28 Sessions à base de nom d’utilisateur ! ! Session = se rappeler de l’utilisateur lors des échanges avec un serveur web ! " l’utilisateur ajoute des produits dans son panier le panier contient les produits lors du passage de la commande V.Marangozova-Martin IBD 29 V.Marangozova-Martin IBD 30 Sessions à base de cookies Sessions à base de nom d’utilisateur (3) ! Ajouter au panier au sein d’un servlet String name = req.getRemoteUser(); if (name == null) { // Explain that the server administrator should // protect this resource } else { String[] items = req.getParameterValues("item"); if (items != null) { for (int i = 0; i < items.length; i++) { addItemToCart(name, items[i]); } } } peut être utilisé dans des traitements qui suivent Exemple " Exemple: " Un servlet peut authentifier et retenir le nom d’un utilisateur " ! Sessions à base de nom d’utilisateur (2) Exemple: " Un autre servlet peut récuperer les produits et passer à la commande String name = req.getRemoteUser(); if (name == null) { // Explain that the server administrator should protect // this page } else { String[] items = getItemsFromCart(name); ... } V.Marangozova-Martin IBD 31 V.Marangozova-Martin IBD 32 Sessions à base de cookies ! ! Servlet API fournit la classe javax.servlet.http.Cookie ! Récupération de cookie public Cookie[ ] HttpServletRequest.getCookies() public void HttpServletResponse.addCookie(Cookie cookie) 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(); } } Les cookies sont envoyés avec des entêtes HTTP " ! Création de cookie : Cookie cookie = new Cookie("ID", "123"); res.addCookie(cookie); public Cookie(String name, String value) Un servlet peut envoyer un cookie au client " ! ! Cookie() constructor " ! Sessions à base de cookies (2) ils doivent être rajoutés à la réponse en premier Un standard (RFC) définit que les navigateurs doivent accepter " " " 20 cookies par site, 300 par utilisateur la taille d’un cookie au moins 4096 bytes. V.Marangozova-Martin IBD 33 References This lecture is extensively based on: ! S. Bodoff. Java Servlet Technology. http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets.html ! M. Boger. Java in Distributed Systems: Concurrency, Distribution and Persistence. Wiley, 2001. ! M. Hall. Servlets and Java ServerPages: A Tutorial. http://www.apl.jhu.edu/ ~hall/java/Servlet-Tutorial/ ! J. Hunter, W. Crawford. Java Servlet Programming. O’Reilly, 1998. ! S. Zeiger. Servlet Essentials. http://www.novocode.com/doc/servlet-essentials/ V.Marangozova-Martin IBD 35 V.Marangozova-Martin IBD 34
Documents pareils
Aucun titre de diapositive - Jean-Loup Guillaume website
Gestion d'un certain nombre de requêtes
Destruction de la Servlet et libération des ressources
Développement Web
"http://java.sun.com/dtd/web-app 2 3.dtd">