Filtre d'écriture de servlet


Les filtres Servlet sont des classes Java qui peuvent être utilisées dans la programmation Servlet dans le but suivant :

  • Intercepter les requêtes des clients avant qu'ils n'accèdent aux ressources backend.

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

Différents types de filtres recommandés par le cahier des charges :

  • Filtres d'authentification.

  • Filtres de compression de données.

  • Filtres de cryptage.

  • Déclenchez le filtre d'événement d'accès aux ressources.

  • Filtres de conversion d'image.

  • Filtres de journalisation et d'audit.

  • Filtres de chaîne de TYPE MIME.

  • Filtres de tokenisation.

  • Filtres XSL/T (Filtres XSL/T), convertissez le contenu XML.

Les filtres sont déployés dans le fichier de descripteur de déploiement web.xml et sont ensuite mappés aux noms de servlets ou aux modèles d'URL dans le descripteur de déploiement de votre application.

Lorsque le conteneur Web démarre une application Web, il crée une instance pour chaque filtre que vous déclarez dans le descripteur de déploiement. Les filtres sont exécutés 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 une classe Java qui implémente l'interface javax.servlet.Filter. L'interface javax.servlet.Filter définit trois méthodes :

Numéro de sérieMéthode et description
1
序号方法 & 描述
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
该方法在每次一个请求/响应对因客户端在链的末端请求资源而通过链传递时由容器调用。
2public void init(FilterConfig filterConfig)
该方法由 Web 容器调用,指示一个过滤器被放入服务。
3public void destroy()
该方法由 Web 容器调用,指示一个过滤器被取出服务。
public void doFilter (ServletRequest, ServletResponse, FilterChain)<🎜>
Le La méthode est appelée par le conteneur chaque fois qu'une paire requête/réponse traverse la chaîne car un client demande 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 Le filtre a été mis en service.
3<🎜>public void destroy()<🎜>
Cette méthode est appelée par le conteneur Web pour indiquer qu'un filtre est sorti Servir.

Exemple de filtre Servlet

Ce qui suit est un exemple de filtre Servlet qui affichera l'adresse IP du client ainsi que la date et l'heure actuelles. Cet exemple vous donne une compréhension de base des filtres Servlet, et vous pouvez utiliser les mêmes concepts pour écrire des applications de filtrage plus complexes :

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// 实现 Filter 类
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) 
                         throws ServletException{
      // 获取初始化参数
      String testParam = config.getInitParameter("test-param"); 

      // 输出初始化参数
      System.out.println("Test Param: " + testParam); 
   }
   public void  doFilter(ServletRequest request, 
                 ServletResponse response,
                 FilterChain chain) 
                 throws java.io.IOException, ServletException {

      // 获取客户机的 IP 地址   
      String ipAddress = request.getRemoteAddr();

      // 记录 IP 地址和当前时间戳
      System.out.println("IP "+ ipAddress + ", Time "
                                       + new Date().toString());

      // 把请求传回过滤链
      chain.doFilter(request,response);
   }
   public void destroy( ){
      /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
   }
}

Compilez LogFilter.java de la manière habituelle, placez votre classe fichiers dans <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Mappage du filtre de servlet dans Web.xml

Définissez un filtre, puis mappez-le à une URL ou un servlet, ce qui revient à définir un servlet puis à le mapper à un modèle d'URL. le même. Créez l'entrée suivante pour la balise de filtre dans le fichier de descripteur de déploiement web.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'applique à tous les servlets car nous spécifions /* dans la configuration . Si vous souhaitez appliquer le filtre uniquement sur quelques servlets, vous pouvez spécifier un chemin de servlet spécifique.

Essayez maintenant d'appeler n'importe quel servlet de la manière habituelle et vous verrez les journaux générés sur le serveur Web. Vous pouvez également utiliser l'enregistreur Log4J pour enregistrer ce qui précède dans un fichier séparé.

Utilisation de plusieurs filtres

Les applications Web peuvent définir plusieurs filtres différents en fonction d'objectifs spécifiques. Supposons que vous définissiez deux filtres AuthenFilter et LogFilter. Vous devez créer un mappage différent comme décrit ci-dessous, et le reste du traitement est à peu près le même que celui expliqué ci-dessus :

<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 d'application des filtres

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

Par exemple, l'exemple ci-dessus appliquera d'abord le LogFilter puis l'AuthenFilter, mais l'exemple suivant inversera cet 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>