English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Les filtres Servlet 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.
Il est possible d'ajouter un ou plusieurs filtres Servlet à un Servlet ou à un groupe de Servlet. Les filtres Servlet peuvent également être ajoutés aux fichiers JavaServer Pages (JSP) et aux pages HTML. Toutes les filtres Servlet attachées sont appelées avant l'appel du Servlet.
Les filtres Servlet sont des classes Java utilisables pour le développement Servlet, qui peuvent réaliser les objectifs suivants :
Intercepter ces requêtes avant que le client accède aux ressources backend.
Traiter ces réponses avant qu'elles ne soient envoyées au client.
Selon les types de filtres recommandés par les normes :
Filtres d'authentification (Authentication Filters).
Filtres de compression de données (Data compression Filters).
Filtres de chiffrement (Encryption Filters).
Filtres déclenchant des événements d'accès aux ressources.
Filtres de conversion d'image (Image Conversion Filters).
Filtres de journalisation et d'audit (Logging and Auditing Filters).
MIME-TYPE Filtres en chaîne (MIME-TYPE Chain Filters).
Filtres de marquage (Tokenizing Filters).
XSL/T Filtres (XSL/T Filters), transformation du contenu XML.
Les filtres sont déclarés via les balises XML du descriptif de déploiement web (web.xml), puis mappés au nom du Servlet ou au schéma d'URL dans le descriptif de déploiement de l'application.
Lorsque le conteneur Web démarre l'application web, il crée un exemple pour chaque filtre déclaré dans le descriptif de déploiement.
L'ordre d'exécution des filtres correspond à l'ordre de configuration dans le fichier web.xml, généralement, les filtres sont configurés avant tous les 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 | Méthode & Description |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) Cette méthode effectue l'opération de filtrage réelle, lorsque la méthode de demande du client correspond à l'URL définie par le filtre, le conteneur Servlet appelle d'abord la méthode doFilter du filtre. FilterChain permet d'accéder aux filtres suivants. |
2 | public void init(FilterConfig filterConfig) Lors du démarrage de l'application web, le serveur web crée un exemple d'objet Filter et appelle sa méthode init pour lire la configuration web.xml, accomplir la fonction d'initialisation de l'objet, et être prêt pour les demandes d'utilisateurs ultérieurs (l'objet filter ne sera créé qu'une seule fois, et la méthode init ne sera exécutée qu'une seule fois). Les développeurs peuvent obtenir l'objet FilterConfig représentant les informations de configuration du filter via les paramètres de la méthode init. |
3 | public void destroy() Servlet 容器在销毁过滤器示例前调用该方法,在该方法中释放 Servlet 过滤器占用的资源。 |
Filter 的 init 方法中提供了一个 FilterConfig 对象。
如 web.xml 文件配置如下:
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>Site</param-name> <param-value>基础教程网</param-value> </init-param> </filter>
在 init 方法使用 FilterConfig 对象获取参数:
public void init(FilterConfig config) throws ServletException { // 获取初始化参数 String site = config.getInitParameter("Site"); // 输出初始化参数 System.out.println("网站名称: " + site); }
以下是 Servlet 过滤器的示例,将输出网站名称和地址。本示例让您对 Servlet 过滤器有基本的了解,您可以使用相同的概念编写更复杂的过滤器应用程序:
package com.w3codebox.test; //导入必需的 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:");//fr.oldtoolbag.com"); // 把请求传回过滤链 chain.doFilter(request,response); } public void destroy( ){ /* 在 Filter 示例被 Web 容器从服务移除之前调用 */ } }
这边使用前文提到的 DisplayHeader.java 为实例:
//导入必需的 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") //Extension de la classe HttpServlet public class DisplayHeader extends HttpServlet // Méthode pour traiter les requêtes GET public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Définir le type de contenu de la réponse response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Exemple de requête HTTP Header" - 基础教程网示例"; 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 nom</th><th>Header valeur</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>"); } // Méthode pour traiter les requêtes de méthode POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Définissez le filtre, puis le mapper à une URL ou un Servlet, ce qui est presque le même que définir un Servlet, puis le mapper à un schéma d'URL. Dans le fichier de description de déploiement web.xml dans lequel créer l'entrée suivante pour le tag filter :
<?xml version="1.0" encoding="UTF-8"?> <web-app> <filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>Site</param-name> <param-value>基础教程网</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <!-- nom de la classe --> <servlet-name>DisplayHeader</servlet-name> <!-- le paquet où il se trouve --> <servlet-class>com.w3codebox.test.DisplayHeader</servlet-class> </servlet> <servlet-mapping> <servlet-name>DisplayHeader</servlet-name> <!-- l'URL visitée --> <url-pattern>/TomcatTest/DisplayHeader</url-pattern> </servlet-mapping> </web-app>
Ce filtre est applicable à tous les Servlet, car nous l'avons spécifié dans la configuration /* . Si vous ne souhaitez appliquer le filtre qu'à un petit nombre de Servlet, vous pouvez spécifier un chemin de Servlet spécifique.
Essayez maintenant d'appeler n'importe quel Servlet de la manière courante, vous verrez les journaux générés par le serveur Web. Vous pouvez également utiliser Log4L'enregistreur J enregistre les journaux ci-dessus dans un fichier distinct.
Ensuite, nous allons accéder à cette adresse d'exemple http://localhost:8080/TomcatTest/DisplayHeader, puis regardez le contenu de la console, comme suit :
L'application Web peut définir plusieurs filtres différents pour des objectifs spécifiques. Supposons que vous définissiez deux filtres AuthenFilter et LogFilterVous devez créer une carte différente comme décrit ci-dessus, le reste du traitement est plus ou moins le même :
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.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.w3codebox.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>
filter dans web.xml-L'ordre des éléments mapping détermine l'ordre d'application des filtres par le conteneur Web. Pour inverser l'ordre des filtres, il suffit de inverser l'ordre des éléments filter dans le fichier web.xml-L'élément mapping suffit.
Par exemple, dans l'exemple ci-dessus, LogFilter sera appliqué en premier, puis AuthenFilter, mais dans l'exemple suivant, l'ordre sera inversé :
<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>
<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ément utilisé pour spécifier le nom complet qualifié de la classe du filtre.
<init-param>Élément utilisé pour spécifier les paramètres d'initialisation du filtre, ses sous-éléments <param-name>Spécifie le nom du paramètre, <param-value>Spécifie la valeur du paramètre.
Dans le filtre, l'objet d'interface FilterConfig peut être utilisé pour accéder aux paramètres d'initialisation.
<filter-mapping>Élément utilisé pour définir les ressources interceptées par un Filter. Une ressource interceptée par un Filter peut être spécifiée de deux manières : le nom du Servlet et l'adresse de la requête d'accès aux ressources
<filter-name>Le sous-élément est utilisé pour définir le nom d'enregistrement de filter. Cette valeur doit être le nom d'un filtre déclaré dans l'élément <filter>.
<url-pattern> définit le chemin d'accès de la requête拦截 par le filtre (style d'URL associé au filtre)
<servlet-name> spécifie le nom du Servlet intercepté par le filtre.
<dispatcher> spécifie la manière dont le conteneur Servlet appelle les ressources interceptées par le filtre, qui peut être l'un des suivants : REQUEST, INCLUDE, FORWARD et ERROR, par défaut REQUEST. L'utilisateur peut définir plusieurs éléments <dispatcher> pour spécifier les multiples modes d'appel de ressources interceptées par le Filter.
Valeurs que peut prendre l'élément <dispatcher> et leur signification
REQUEST : Lorsque l'utilisateur accède directement à la page, le conteneur Web appelle le filtre. Si la ressource cible est accédée via la méthode include() ou forward() de RequestDispatcher, alors ce filtre ne sera pas appelé.
INCLUDE : Si la ressource cible est accédée via la méthode include() de RequestDispatcher, alors ce filtre sera appelé. Sinon, ce filtre ne sera pas appelé.
FORWARD : Si la ressource cible est accédée via la méthode forward() de RequestDispatcher, alors ce filtre sera appelé, sinon, ce filtre ne sera pas appelé.
ERROR : Si la ressource cible est appelée par un mécanisme de traitement d'exceptions déclaratif, alors ce filtre sera appelé. Sinon, le filtre ne sera pas appelé.