Servlets - Écriture de filtres

Les filtres de servlet sont des classes Java qui peuvent être utilisées dans la programmation de servlet aux fins suivantes:

  • Pour intercepter les demandes d'un client avant qu'il n'accède à une ressource en back-end.

  • Pour manipuler les réponses du serveur avant qu'elles ne soient renvoyées au client.

Il existe différents types de filtres suggérés par les spécifications -

  • Filtres d'authentification.
  • Filtres de compression de données.
  • Filtres de cryptage.
  • Filtres qui déclenchent des événements d'accès aux ressources.
  • Filtres de conversion d'image.
  • Filtres de journalisation et d'audit.
  • Filtres de chaîne MIME-TYPE.
  • Filtres de tokenisation.
  • Filtres XSL / T qui transforment le contenu XML.

Les filtres sont déployés dans le fichier descripteur de déploiement web.xml puis mappez vers les noms de servlet ou les modèles d'URL dans le descripteur de déploiement de votre application.

Lorsque le conteneur Web démarre votre application Web, il crée une instance de chaque filtre que vous avez déclaré dans le descripteur de déploiement. Les filtres s'exécutent dans l'ordre dans lequel ils sont déclarés dans le descripteur de déploiement.

Méthodes de filtrage des servlets

Un filtre est simplement une classe Java qui implémente l'interface javax.servlet.Filter. L'interface javax.servlet.Filter définit trois méthodes -

N ° Sr. Méthode et description
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Cette méthode est appelée par le conteneur chaque fois qu'une paire demande / réponse est transmise à travers la chaîne en raison d'une demande client pour une ressource à la fin de la chaîne.

2

public void init(FilterConfig filterConfig)

Cette méthode est appelée par le conteneur Web pour indiquer à un filtre qu'il est mis en service.

3

public void destroy()

Cette méthode est appelée par le conteneur Web pour indiquer à un filtre qu'il est mis hors service.

Filtre de servlet - Exemple

Voici l'exemple de filtre de servlet qui imprimerait l'adresse IP du client et l'heure actuelle. Cet exemple vous donnerait une compréhension de base du filtre de servlet, mais vous pouvez écrire des applications de filtre plus sophistiquées en utilisant le même concept -

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) throws ServletException {
      
      // Get init parameter 
      String testParam = config.getInitParameter("test-param"); 

      //Print the init parameter 
      System.out.println("Test Param: " + testParam); 
   }
   
   public void  doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws java.io.IOException, ServletException {

      // Get the IP address of client machine.
      String ipAddress = request.getRemoteAddr();

      // Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time " + new Date().toString());

      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }

   public void destroy( ) {
      /* Called before the Filter instance is removed from service by the web container*/
   }
}

Compiler LogFilter.java de manière habituelle et placez votre fichier de classe dans <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes

Mappage de filtre de servlet dans Web.xml

Les filtres sont définis puis mappés à une URL ou à un servlet, de la même manière que le servlet est défini puis mappé à un modèle d'URL. Créez l'entrée suivante pour la balise de filtre dans le fichier descripteur de déploiementweb.xml

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Le filtre ci-dessus s'appliquerait à toutes les servlets car nous avons spécifié /*dans notre configuration. Vous pouvez spécifier un chemin de servlet particulier si vous souhaitez appliquer le filtre à quelques servlets uniquement.

Maintenant, essayez d'appeler n'importe quel servlet de la manière habituelle et vous verrez le journal généré dans le journal de votre serveur Web. Vous pouvez utiliser l'enregistreur Log4J pour enregistrer le journal ci-dessus dans un fichier séparé.

Utilisation de plusieurs filtres

Votre application Web peut définir plusieurs filtres différents dans un but précis. Considérez, vous définissez deux filtres AuthenFilter et LogFilter . Le reste du processus resterait comme expliqué ci-dessus, sauf que vous devez créer un mappage différent comme indiqué ci-dessous -

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>AuthenFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Ordre des applications des filtres

L'ordre des éléments de mappage de filtre dans web.xml détermine l'ordre dans lequel le conteneur Web applique le filtre au servlet. Pour inverser l'ordre du filtre, il vous suffit d'inverser les éléments de mappage de filtre dans le fichier web.xml.

Par exemple, l'exemple ci-dessus appliquerait d'abord LogFilter, puis AuthenFilter à n'importe quel servlet, mais l'exemple suivant inverserait l'ordre -

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>