Servlet. Laurent Réveillère. Contexte

Documents pareils
Web Tier : déploiement de servlets

Le développement d applications Web

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

HTTP 1.1. HyperText Transfer Protocol TCP IP ...

Le développement d applications Web. François Charoy Pascal Molli Pascal Urso

Application web de gestion de comptes en banques

JavaServer Pages (JSP)

Traitement des données de formulaires. Accès aux BD avec JDBC Servlets - M. Baron - Page

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Les architectures 3-tiers Partie I : les applications WEB

Groupe Eyrolles, 2005, ISBN :

Auto-évaluation Programmation en Java

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

Utilisation de Jakarta Tomcat

Jahia CMS ET Portal Version 5.0

Architecture Orientée Service, JSON et API REST

Application Web et J2EE

1. Installation d'un serveur d'application JBoss:

HYPERPLANNING EST UN LOGICIEL INDEX EDUCATION

Projet gestion d'objets dupliqués

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Alfstore workflow framework Spécification technique

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

Sommaire Accès via un formulaire d'identification... 4 Accès en mode SSO... 5 Quels Identifiant / mot de passe utiliser?... 6

Projet Java EE Approfondi

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Applications et Services WEB: Architecture REST

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Serveur d'archivage 2007 Installation et utilisation de la BD exist

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

TP JAVASCRIPT OMI4 TP5 SRC

Outil de planification en ligne pour des créations de rendez-vous ou de sondage

Programmer en JAVA. par Tama

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Premiers Pas en Programmation Objet : les Classes et les Objets

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Authentification et contrôle d'accès dans les applications web

RÉALISATION D UN SITE DE RENCONTRE

Programmation Internet en Java

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

OpenPaaS Le réseau social d'entreprise

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Programmation Web. Madalina Croitoru IUT Montpellier

Sécurité des applications web. Daniel Boteanu

TP1 : Initiation à Java et Eclipse

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Module BD et sites WEB

Remote Method Invocation (RMI)

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Java Naming and Directory Interface

Programmation Internet Cours 4

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Compte Rendu d intégration d application

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

RMI le langage Java XII-1 JMF

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

Vulnérabilités et sécurisation des applications Web

Approche Contract First

Guide d implémentation. Réussir l intégration de Systempay

Le Modèle de Sécurité dans JAVA

Java DataBaseConnectivity

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Single Sign-On open source avec CAS (Central Authentication Service)

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Mise en place d un serveur Proxy sous Ubuntu / Debian

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Une introduction à la technologie EJB (2/3)

Application de lecture de carte SESAM-Vitale Jeebop

MANUEL D INSTALLATION de GEONETWORK sur un serveur LINUX CentOS 4

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.

Java Licence Professionnelle CISII,

INITIATION AU LANGAGE JAVA

Table des matières Hakim Benameurlaine 1

Best Practices : Utilisation des APIs de Lotus Web Content Management

18 TCP Les protocoles de domaines d applications

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Les services usuels de l Internet

arcopole Studio Annexe 7 Architectures Site du programme arcopole :

ADMINISTRATION DE ADOBE LIVECYCLE MOSAIC 9.5

La base de données XML exist. A. Belaïd

F. Barthélemy. 17 mai 2005

Génie Logiciel avec Ada. 4 février 2013

API SMS CONSEIL HTTP V2.01. Sommaire. Documentation V1.0 au 21/05/2011

CAS, un SSO web open source. 14h35-15h25 - La Seine A

Patrons de conception [Krakowiak06]

Plateforme PAYZEN. Définition de Web-services

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Architectures client/serveur

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Gestion distribuée (par sockets) de banque en Java

Devenez un véritable développeur web en 3 mois!

Transcription:

Servlet Laurent Réveillère laurent.reveillere@u-bordeaux.fr http://www.reveillere.fr/ Contexte Un serveur Web peut héberger plusieurs applications Web Les requêtes HTTP sont traitées par une application spécifique en fonction de l URL de la requête Chaque application a son propre contexte qui est la partie de l URL placée juste après le nom de la machine serveur : http://www.machin.com/nomappli/rep/index.html 1

Fonctionnalité de base De base un serveur Web ne fournit que des pages HTML statiques Un servlet est : un composant logiciel écrit en Java qui s exécute en programme «compagnon» d un serveur Web Il reçoit des requêtes de clients HTTP et construit des pages dynamiques écrites en HTML, qui sont renvoyées en réponse aux clients Fonctionnement d un servlet 2

Exemple de servlet package fr.enseirb.t2.servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; public class HelloServlet extends HttpServlet { protected void doget(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setcontenttype("text/html"); PrintWriter out = resp.getwriter(); out.println("<html>"); out.println("<body>"); out.println("hello World!"); out.println("</body>"); out.println("</html>"); } } Conteneur de servlets Les serveurs HTTP ne savent pas exécuter directement le code Java d un servlet Les servlets nécessitent un conteneur de servlets qui se charge de la gestion des servlets : gestion des noms des servlets (associés à une classe Java) création et initialisation des servlets suppression des servlets Le serveur Web lui passe la main quand il reçoit d un client une requête qui doit être traitée par un servlet (reconnaissable à l URL) 3

URL d un servlet Le client ne peut donner une adresse directe du servlet L application Web doit établir une correspondance (un mapping) entre le servlet et un URL (avec une annotation ou le fichier web.xml) Demander cet URL passera la main au conteneur de servlets qui lancera l exécution du servlet Annotations Depuis la spécification Servlet 3.0, il est possible de se passer de fichier web.xml pour déclarer un servlet Version courante : 3.1 (async, websocket, ) Version 4.0 en préparation (multiplexing, push, ) Il suffit d annoter la classe du servlet par l annotation @WebServlet qui possède des attributs pour donner toutes les informations nécessaires au fonctionnement du servlet : nom, pattern URL, 4

Exemple package fr.enseirb.t2.servlet; @WebServlet(urlPatterns="/foo") public class HelloServlet extends HttpServlet { } } http://www.machin.com/nomappli/foo Fichier web.xml Le mapping peut aussi être donné dans le fichier web.xml qui décrit toute application Web Java (étudié plus loin en détails) Ce fichier sera contenu dans un fichier WAR (extension «.war»), fichier ZIP qui enveloppe tous les composants, code et ressources de l application Web 5

Exemple de web.xml <?xml version="1.0" encoding="utf-8"?> <web-app > <session-config> <session-timeout>30</session-timeout> </session-config> <servlet> <servlet-name>helloworld</servlet-name> <servlet-class>fr.enseirb.t2.servlet.hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloworld</servlet-name> <url-pattern>hello</url-pattern> </servlet-mapping> </web-app> Joker dans les mappings Le modèle pour l URL peut contenir un joker (*) à la fin d une URL qui commence par «/» ou juste avant une extension Exemple <url-pattern>/servlet/*</url-pattern> <url-pattern>*.serv</url-pattern> 6

Les paquetages Le paquetage javax.servlet contient les classes et interfaces utilisées pour écrire des servlets Le paquetage javax.servlet.http contient les classes et interfaces pour écrire des servlets qui fonctionnent avec le protocole HTTP c est presque toujours le cas Classes et interfaces de base <<interface>> Servlet GenericServl et {abstract} HttpServlet {abstract} init appelé par le conteneur à la création du servlet service traite une requête destroy appelé par le conteneur à la suppression du servlet getservletconfig donne accès aux paramètres d initialisation du servlet (web.xml) getservletinfo informations sous forme de String 7

Classes et interfaces L interface ServletRequest représente la requête du client au serveur L'interface ServletResponse représente la réponse du serveur Les interfaces HttpServletRequest et HttpServletResponse sont des interfaces filles pour travailler avec le protocole HTTP (ce qui est presque toujours le cas) Traitements effectués par les servlets Traite les requêtes des clients Web public void service(servletrequest, ServletResponse) Méthode abstraite Définir si on hérite de GenericServlet Majorité des servlets sont des servlets HTTP Héritent de HttpServlet Éviter de modifier la méthode service Redéfinir les méthodes doget, dopost,... 8

Traitements effectués par les servlets HTTP La méthode service de la classe HTTPServlet délègue le traitement à une autre méthode, selon le type de requête HTTP envoyée par le client : doget() dopost() doput() dodelete() dohead() dooptions() dotrace() Cycle de vie d un servlet Le plus souvent le serveur d application ne crée qu un seul objet servlet par application et par type de servlet Le servlet est créé à la première connexion à un URL qui correspond (urlmapping) au servlet Le servlet est supprimé quand l application est retirée du serveur (undeploy) 9

Un thread par client Création d un thread par le container de servlet Pour traiter chaque connexion ultérieure qui doit être traitée par le même type de servlet Variables d instance des servlets Accessibles par tous les clients Ne pas garder d information spécifique à un client Éventuelles informations conservée dans le servlet Protection contre les accès concurrents Cycle de vie Init Initialiser des ressources qui seront utiles pendant l existence du servlet Exemple: accès à une BDD Destroy Libérer les ressources Exemple: connexions à une BDD 10

Code d un servlet Écrire un servlet HTTP c est écrire une classe qui hérite de HttpServlet redéfinir au moins une des méthodes doget, dopost, redéfinir éventuellement une des méthodes init ou destroy si le servlet gère des ressources qu il faut initialiser ou supprimer HttpServlet(Request Response) HttpServletRequest Objet correspondant à la requête HTTP headers, cookies envoyés par la requête, paramètres HttpServletResponse Objet correspondant à la réponse qui sera envoyée Code de statut de la réponse Headers et cookies Contient la méthode getwriter() pour obtenir le flot de sortie pour générer la page HTML résultat Contient une méthode pour envoyer au client une réponse de redirection ou un message d erreur 11

Paramètres d initialisation d un servlet Informations qui pourront être utilisées par le servlet Exemple: adresse d une base de données Valeurs données dans le fichier web.xml ou dans l annotation @WebServlet Le fichier web.xml l emporte sur les annotations Permet de modifier ces informations sans devoir recompiler l application Exemple d initialisation dans web.xml <servlet> <servlet-name>servlet1</servlet-name> <init-param> <param-name>p1</param-name> <param-value>v1</param-value> </init-param> <init-param> <param-name>p2</param-name> <param-value>v2</param-value> </init-param> </servlet> 12

Exemple d initialisation avec annotation @WebServlet( name = "Servlet1", urlpatterns = {"/add1"}, initparams = { @InitParam(name="p1", value="v1"), @InitParam(name="p2", value="v2")} ) public class Servlet1 extends HttpServlet {... Récupérer les paramètres d initialisation Méthodes de l interface ServletConfig HttpServlet implémente ServletConfig ServletConfig contient les méthodes Enumeration<String> getinitparameternames() retourne une énumération des noms des paramètres String getinitparameter(string) retourne la valeur du paramètre d initialisation dont le nom est passé en paramètre public class Servlet1 extends HttpServlet {... Enumeration<String> e = getinitparameternames(); while (e.hasmoreelements()) { String nom = e.nextelement(); String v = getinitparameter(nom);... }... } 13

Contexte d une application Plusieurs applications hébergées par le même serveur Web Chaque application Web décrite par un fichier web.xml (ou par des annotations) et définit un contexte interface ServletContext qui représente le contexte dans lequel l application s exécute Durant l exécution URL donné par le client détermine le contexte utilisé Obtenir le contexte : request.getcontextpath() Exemple pour «http://machin.com/appli/liste» Paramètres d initialisation d un contexte Paramètres seront connus de tous les servlets de l application Initialisation d un paramètre dans web.xml : <web-app> <context-param> <param-name>p1</param-name> <param-value>v1</param-value> </context-param>... ServletContext contexte = getservletcontext(); Enumeration<String> e = contexte.getinitparameternames(); while (e.hasmoreelements()) { String nom = e.nextelement(); String v = contexte.getinitparameter(nom);... } 14

Forward et redirect Déléguer des traitement à une autre partie de l application ou à une autre application forward Servlet passe la main à une autre partie de l application Envoie la requête reçue et la référence pour répondre au client Transparent pour le client public void doget (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {... request.getrequestdispatcher("/servlet1").forward(request, response); } Forward et redirect Déléguer des traitement à une autre partie de l application ou à une autre application redirect Permet de passer la main en dehors de l application Réponse demandant au client d envoyer une requête vers une autre URL public void doget (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {... response.sendredirect("http://.../index.html?p1=val1"); } 15

Conserver des données Une requête peut être traitée par plusieurs servlets Exemple du forward Les servlets permettent de conserver des données pendant une requête de l utilisateur ou même entre 2 requêtes, pendant une session de travail de l utilisateur Ils peuvent même partager des données avec tous les servlets de l application y compris ceux qui sont utilisés par d autres utilisateurs 3 portées pour conserver des données Requête depuis l arrivée de la requête jusqu au renvoi de la réponse au client Accès par : HttpServletRequest Session de la première connexion de l utilisateur jusqu à expiration par timeout (optionnel) ou fermeture explicite de la session (ou arrêt du serveur) Accès par HttpSession getsession() Application toute la durée de vie de l application Accès par ServletContext getservletcontext() 16

Attributs Conserver des objets (types primitifs interdits) dans les différentes portées en utilisant la notion d attribut Ranger un objet val1 dans la session : HttpSession session = request.getsession(); session.setattribute("p1", val1); Récupérer l objet dans la session : HttpSession session = request.getsession(); Type1 v1 = (Type1)session.getAttribute("p1", val1); Code semblable pour les portées application et requête Gestion de sessions dans les Servlets Il existe une «Servlet session API» Permet de récupérer un objet HttpSession à partir de la requête (HTTPServletRequest) L objet HTTPSession est une HashMap Java Gestion des objets dans la session ajout, modification, retrait, recherche, etc. Gestion des méta-information à propos de la session date de création, identiant de la session, etc. 17

Récupérer l objet session Utiliser cette méthode : HttpServletRequest.getSession() Exemple: HttpSession session = request.getsession(true); Retourne la session en cours, en crée une (true) si il n en existe pas. Pour savoir si il s agit d une nouvelle session utiliser la méthode isnew() de la session En coulisse Quand on appelle getsession(true) chaque utilisateur se voit attribuer un Session ID Le Session ID est communiqué au client Option 1: si le navigateur supporte les cookies, la Servlet créée un cookie avec le session ID, dans Tomcat, ce cookie est appelé JSESSIONID Option 2: si le navigateur ne supporte pas les cookies, la servlet va essayer de récupérer le session ID depuis l URL 18

Récupérer des données de la session L objet session fonctionne comme une HashMap Peut stocker n importe quel type d objet, Les objets ont une «clé d accès» comme dans les Maps Java Exemple de récupération : Integer accesscount =(Integer) session.getattribute("accesscount"); Récupérer toutes les «clés» de tous les objets dans la session : Enumeration attributes = request.getattributenames(); Mettre des données dans la session Les objets que l on met dans la sessions sont des attributs : HttpSession session = request.getsession(); session.setattribute("nom", "Michel Buffa"); Et on peut les supprimer : session.removeattribute("name"); 19

Autres informations de session Récupérer le session ID, par exemple : gj9xswvw9p public String getid(); Voir si la session vient juste d être créée : public boolean isnew(); Récupérer la date de création : public long getcreationtime(); Dernière fois que la session a été activée (ex dernière date de connexion) public long getlastaccessedtime(); Session Timeout Récupérer le plus grand temps (secondes) d inactivité de la session (ex : on veut la fermer si pendant 5mn on ne fait rien) public int getmaxinactiveinterval(); Si on spécifie cet intervalle, la session sera fermée (invalidée) automatiquement lorsqu un utilisateur ne fait rien pendant un temps plus long: public void setmaxinactiveinterval (int seconds); Si la valeur est négative : jamais d interruption 20

Terminer une session Pour terminer (invalider) une session : public void invalidate(); Typiquement, on fait ça au logout, ou au passage d une commande sur un site de e-commerce Les sessions peuvent se terminer automatiquement lors de périodes d inactivité Login / Logout Exemple Une appli web protégée par login / password On utilise la session pour stocker l utilisateur loggué On utilise la clé "username" Lorsqu elle est présente, la valeur = le nom de l utilisateur loggué Lors de l authentification on rajoute la clé si les login/password sont valides Cliquer sur logout invalide la session La servlet principale vérifie que l utilisateur courant est loggué 21

Formulaire de login LoginForm.html <html> <head><title>login</title></head> <body> <form method="post" action="loginservlet"> Please login:<br> Username: <input type="text" name="username"><br> Password: <input type="password" name="password"><br> <input type="submit" value="login"> </form> </body> </html> LoginServlet LoginServlet.java public class LoginServlet extends HttpServlet { public void dopost(httpservletrequest req, HttpServletResponse resp) throws IOException, ServletException { } } String username = req.getparameter("username"); String password = req.getparameter("password"); if (isloginvalid(username, password)) { HttpSession session = req.getsession(); session.setattribute("user", username); response.sendredirect("mainservlet"); } else { response.sendredirect("invalidlogin.html"); } 22

LogoutServlet LogoutServlet.java public class LogoutServlet extends HttpServlet { protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { } } HttpSession session = request.getsession(); session.invalidate(); response.setcontenttype("text/html"); ServletOutputStream out = response.getoutputstream(); out.println("<html><head>"); out.println("<title>logout</title></head>"); out.println("<body>"); out.println("<h1>logout successfull.</h1>"); out.println("</body></html>"); MainServlet MainServlet.java public class MainServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = request.getsession(); String username = (String) session.getattribute("user"); if (username!= null) { response.setcontenttype("text/html"); ServletOutputStream out = resp.getoutputstream(); out.println("<html><body><h1>"); out.println("hello, " + username + "! "); out.println("</h1></body></html>"); } else { response.sendredirect("loginform.html"); } } } 23

Page InvalidLogin.html InvalidLogin.html <html> <head> <title>error</title> </head> <body> <h1>invalid login!</h1> Please <a href="loginform.html">try again</a>. </body> </html> Problèmes avec le cache du navigateur La plupart des navigateurs utilisent un cache pour les pages et les images L utilisateur peut voir l ancien état d une page Peut paraitre pour un bug, surtout dans le cas d une page de login Pour éviter cela, il faut désactiver le cache dans la réponse HTTP : response.setheader("pragma", "No-cache"); response.setdateheader("expires", 0); response.setheader("cache-control", "no-cache"); 24

Structure d une application Web Spécification des servlets normalise la présentation des applications Web Améliore la portabilité des applications Fichier au format jar mais d extension war Structure d un fichier.war Répertoire racine Pages statiques html Ressources (images, fichiers css, fichiers js, ) Sous-répertoire WEB-INF Classes Java utilisées par l application fichier de configuration de l application Filtres Objet qui intercepte Requêtes avant qu elles ne soient traitées par un servlet Réponses juste après qu elles aient été générées par un servlet Chaînage des filtres À l image des pipes sous Unix 25

Déclaration d un filtre Balise <filter> du fichier web.xml ou annotation @WebFilter de la classe du filtre Indication des requêtes qui seront filtrées par la balise <filter-mapping> de web.xml ou un attribut de l annotation @WebFilter nom d un ou plusieurs servlets ou un ou plusieurs modèles d URL Paramètres d initialisation Comme pour les servlets, on peut donner des paramètres d initialisation à un filtre On peut utiliser pour cela balise <init-param> (dans la balise <filter>) dans le fichier web.xml ou annotation @WebInitParam, directement dans l attribut initparams de l annotation @WebFilter 26

Exemples <filter> <filter-name>filtre1</filter-name> <filter-class>fr.foo.bar.filtre1</filter-class> <init-param> <param-name>p1</param-name> <param-value>v1</param-value> </init-param> </filter> <filter-mapping> <filter-name>filtre1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> @WebFilter( filtername = "Filtre1", urlpatterns = {"/*"}, initparams = { @WebInitParam(name="p1", value="v1") } ) public class Filtre1 implements Filter {... } Ordre d exécution des filtres Si plusieurs filtres peuvent s appliquer Ordre d exécution déterminé par l ordre de déclaration des <filter-mapping> dans le fichier web.xml pas possible avec l annotation En appelant dofilter, on appelle le prochain filtre Cas du dernier filtre è envoie de la requête au servlet ou envoie de la réponse au client 27