GLO-4002 - Site du cours 2023

Temps estimé: 20 minutes

Exercice extra sur les servlets en java

Cet exercice est un défi supplémentaire pour l'exercice sur les couches applicatives.

Défi supplémentaire : Comprendre les serveurs web

Cette section est pour vous aider à comprendre vos outils et sera utile pour le prochain lab. Si vous n'êtes pas familiers avec les concepts HTTP en Java (servlet container, servlet, request, response, etc), lisez d'abord la section de théorie ci-bas

Notre magasin se fait constamment pirater! En fait, on a découvert que les hackers utilisent tous Chrome, alors on veut le bloquer!

Pour se faire, on voudrait intercepter toutes les requêtes avant même qu'elles se rendent aux ressources. Sinon, il faudrait coder ça dans chaque ressource et c'est déplaisant.

Il existe donc la notion de Filter dans JAX-RS qui nous permet d'intercepter les requêtes. Pour ce faire, on doit hériter de ContainerRequestFilter (contraiment au CORSFilter déjà en place qui lui hérite de ContainerResponseFilter. Réfléchissez-y, vous verrez la différence :P).

Un coup dans un ContainerRequestFilter, il est possible d'obtenir le User agent de la requête avec le code suivant :

String userAgent = request.getHeaders().getFirst("User-Agent");

Dans un premier temps, faites simplement logger ça pour voir ce qui est retourné. Essayez de trouver dans la string un pattern qui vous permettrait de détecter que c'est Chrome (ne soyez pas trop zélé sur ça non plus, c'est un exercice :P)

Vous pouvez ensuite utiliser le filter pour arrêter carrément la requête avec ceci :

request.abortWith(Response.status(Status.BAD_REQUEST).entity(/* ... */).build());

Pour ceux qui connaissent le pattern OO, ce principe est en fait un Pipe and filter, qui est une sorte de Chain of responsability.

Serveur HTTP

Il s'agit du niveau le plus "bas", qui sert à comprendre le protocol HTTP :

  • Écoute sur un port donné à une ou plusieurs adresses données
  • Reçoit une requête suivant le protocole HTTP
  • Renvoie une réponse à la requête en utilisant le protocole HTTP

alt-text

Resources

Servlet Container ou Web Container

Le serveur web comprend et analyse les requêtes HTTP entrantes et les envoie au bon "request handler" en fonction des paramètres.

Dans ce cours, Jetty est votre conteneur Web. Il est responsable d'envoyer les requêtes aux "request handlers" qu'on appelle "Servlets" en Java.

alt-text

Qu'est-ce qu'un servlet? Un servlet est une interface standard en Java qui permet de prendre en charge des requêtes HTTP (request handler)

Ressources

Servlet Filters

Un filtre de servlet est un objet qui intercepte les requêtes HTTP.

Le filtre se place avant les autres composantes (servlets, JSP, fichiers statics), tel qu'illustré ici :

alt-text

Il peut également agir sur la réponse retournée dans certains cas.

Ressources:

Et Jersey?

Jersey est un framework pour développer des services web RESTful. Il agit d'abord comme un servlet qui permet aux programmeurs de facilement enregistrer des resources via un framework d'inversion de contrôle (IoC).

Jersey regarde à chaque requête qui lui est attribué et, basé sur l'URL, le type de contenu demandé, etc., il réparti la requête à la bonne ressource.

Stack complète en production

Firewall --> WAF --> Web Server (Nginx) --> Web Application (Jetty) --> Requeset Handler (Jersey) --> Application Logic (REST resource + domain) --> Database (Oracle/MongoDB)