JSP Filtres
Les filtres dans JSP et Servlet sont tous deux des classes Java.
Les filtres peuvent intercepter dynamiquement les requêtes et les réponses pour transformer ou utiliser les informations contenues dans les requêtes ou les réponses.
Vous pouvez attacher un ou plusieurs filtres à une Servlet ou à un groupe de Servlets. Les filtres peuvent également être attachés à des fichiers JavaServer Pages (JSP) et à des pages HTML.
Les filtres sont des classes Java qui peuvent être utilisées dans la programmation Servlet pour atteindre les objectifs suivants :
- Intercepter les requêtes client avant qu'elles n'accèdent aux ressources backend.
- Traiter les réponses du serveur avant qu'elles ne soient renvoyées au client.
Divers types de filtres suggérés par la spécification :
- Filtres d'authentification.
- Filtres de compression de données.
- Filtres de chiffrement.
- Filtres qui déclenchent des événements d'accès aux ressources.
- Filtres de conversion d'images.
- 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éclarés avec des balises XML dans le descripteur de déploiement Web (web.xml), puis mappés à un nom de Servlet ou à un motif 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 avez déclaré dans le descripteur de déploiement.
L'ordre d'exécution des filtres est conforme à l'ordre de configuration dans le fichier de configuration web.xml ; généralement, les filtres sont configurés avant tous les Servlets.

Méthodes des filtres Servlet
Un filtre est une classe Java qui implémente l'interface javax.servlet.Filter. L'interface javax.servlet.Filter définit trois méthodes :
| N° de série | Metode & Deskripsi |
|---|---|
| 1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) Cette méthode effectue l'opération de filtrage réelle. Lorsqu'une requête client correspond à l'URL définie pour le filtre, le conteneur Servlet appelle d'abord la méthode doFilter du filtre. FilterChain est utilisé pour accéder aux filtres suivants. |
| 2 | public void init(FilterConfig filterConfig) Lorsque l'application Web démarre, le serveur Web crée un objet instance du filtre et appelle sa méthode init pour lire la configuration de web.xml et terminer l'initialisation de l'objet, afin de se préparer à intercepter les requêtes utilisateur suivantes (l'objet filtre n'est créé qu'une seule fois et la méthode init n'est exécutée qu'une seule fois). Grâce aux paramètres de la méthode init, les développeurs peuvent obtenir l'objet FilterConfig représentant les informations de configuration du filtre actuel. |
| 3 | public void destroy() Le conteneur Servlet appelle cette méthode avant de détruire l'instance de filtre et, dans cette méthode, libère les ressources occupées par le filtre Servlet. |
Utilisation de FilterConfig
La méthode init de Filter fournit un objet FilterConfig.
Par exemple, le fichier web.xml est configuré comme suit :
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.example.test.LogFilter</filter-class> <init-param> <param-name>Site</param-name> <param-value>Example</param-value> </init-param> </filter>
Utilisez l'objet FilterConfig dans la méthode init pour obtenir des paramètres :
public void init(FilterConfig config) throws ServletException {
// 获取初始化参数
String site = config.getInitParameter("Site");
// 输出初始化参数
System.out.println("网站名称: " + site);
}
Exemple de filtre JSP
Voici un exemple de filtre Servlet qui affichera le nom et l'adresse du site web. Cet exemple vous donne une compréhension de base des filtres Servlet ; vous pouvez utiliser le même concept pour écrire des applications de filtre plus complexes :
//导入必需的 java 库
import javax.servlet.*;
import java.util.*;
//实现 Filter 类
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// 获取初始化参数
String site = config.getInitParameter("Site");
// 输出初始化参数
System.out.println("网站名称: " + site);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
// 输出站点名称
System.out.println("站点网址:http://www.example.com");
// 把请求传回过滤链
chain.doFilter(request,response);
}
public void destroy( ){
/* 在 Filter 实例被 Web 容器从服务移除之前调用 */
}
}
Le code du fichier DisplayHeader.java est le suivant :
//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DisplayHeader")
//扩展 HttpServlet 类
public class DisplayHeader extends HttpServlet {
// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "HTTP Header 请求实例 - Example实例";
String docType =
"<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
"<body bgcolor=\"#F0F0F0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<table width=\"100%\" border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
"<th>Header 名称</th><th>Header 值</th>\n"+
"</tr>\n");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
out.println("</table>\n</body></html>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Mappage de filtre Servlet dans Web.xml
Définir un filtre puis le mapper à une URL ou à un Servlet est à peu près la même chose que définir un Servlet puis le mapper à un motif d'URL. Dans le fichier descripteur de déploiementweb.xmlcréez les entrées suivantes pour la balise filter :
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.example.test.LogFilter</filter-class>
<init-param>
<param-name>Site</param-name>
<param-value>Example</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<!-- 类名 -->
<servlet-name>DisplayHeader</servlet-name>
<!-- 所在的包 -->
<servlet-class>com.example.test.DisplayHeader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayHeader</servlet-name>
<!-- 访问的网址 -->
<url-pattern>/TomcatTest/DisplayHeader</url-pattern>
</servlet-mapping>
</web-app>
Le filtre ci-dessus s'applique à tous les Servlets car nous avons spécifié dans la configuration/*. Si vous souhaitez uniquement appliquer le filtre à quelques Servlets, vous pouvez spécifier un chemin de Servlet spécifique.
Maintenant, essayez d'appeler n'importe quel Servlet de la manière habituelle, et vous verrez les journaux générés dans le serveur Web. Vous pouvez également utiliser un logger Log4J pour enregistrer les journaux ci-dessus dans un fichier séparé.
Ensuite, nous visitons cette adresse d'exemplehttp://localhost:8080/TomcatTest/DisplayHeader, puis vérifions la sortie dans la console, comme indiqué ci-dessous :

Utilisation de plusieurs filtres
Les applications Web peuvent définir plusieurs filtres différents à des fins spécifiques. Supposons que vous définissiez deux filtresAuthenFilteretLogFilter. Vous devez créer un mappage différent comme décrit ci-dessous ; le reste du traitement est à peu près le même que celui expliqué ci-dessus :
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.example.test.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>com.example.test.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'ordre des éléments filter-mapping dans web.xml détermine l'ordre dans lequel le conteneur Web applique les filtres aux Servlets. Pour inverser l'ordre des filtres, il vous suffit d'inverser les éléments filter-mapping dans le fichier web.xml.
Par exemple, l'exemple ci-dessus appliquera d'abord LogFilter, puis 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>
Explication des éléments de configuration de web.xml
<filter>Spécifie un filtre.<filter-name>Utilisé pour spécifier un nom pour le filtre ; le contenu de cet élément ne peut pas être vide.<filter-class>L'élément est utilisé pour spécifier le nom de classe pleinement qualifié du filtre.<init-param>L'élément est utilisé pour spécifier des paramètres d'initialisation pour le filtre ; ses éléments enfants<param-name>spécifient le nom du paramètre,<param-value>spécifient la valeur du paramètre.- Dans le filtre, vous pouvez utiliser
FilterConfigl'objet d'interface pour accéder aux paramètres d'initialisation.
<filter-mapping>L'élément est utilisé pour définir les ressources qu'un Filtre est chargé d'intercepter. Les ressources interceptées par un Filtre peuvent être spécifiées de deux manières : le nom de la Servlet et le chemin de requête pour l'accès aux ressources.<filter-name>L'élément enfant est utilisé pour définir le nom d'enregistrement du filtre. Cette valeur doit être<filter>le nom du filtre déclaré dans l'élément.<url-pattern>Définit le chemin de requête intercepté par le filtre (le modèle d'URL associé au filtre).
<servlet-name>Spécifie le nom de la Servlet interceptée par le filtre.<dispatcher>Spécifie comment la ressource interceptée par le filtre est invoquée par le conteneur de servlets ; il peut s'agir deREQUEST,INCLUDE,FORWARDetERRORl'une des suivantes ; la valeur par défaut estREQUEST. Les utilisateurs peuvent définir plusieurs<dispatcher>éléments enfants pour spécifier que le Filtre intercepte plusieurs modes d'invocation de la ressource.<dispatcher>Les valeurs qui peuvent être définies pour l'élément enfant et leurs significationsREQUEST: Lorsque l'utilisateur accède directement à la page, le conteneur Web invoquera le filtre. Si la ressource cible est accédée via la méthode include() ou forward() de RequestDispatcher, le filtre ne sera pas invoqué.INCLUDE: Si la ressource cible est accédée via la méthode include() de RequestDispatcher, le filtre sera invoqué. En dehors de ce cas, le filtre ne sera pas invoqué.FORWARD: Si la ressource cible est accédée via la méthode forward() de RequestDispatcher, le filtre sera invoqué. En dehors de ce cas, le filtre ne sera pas invoqué.ERROR: Si la ressource cible est invoquée via le mécanisme déclaratif de gestion des exceptions, le filtre sera invoqué. En dehors de ce cas, le filtre ne sera pas invoqué.