English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Les filtres dans JSP et Servlet sont tous 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.
Il est possible d'ajouter un ou plusieurs filtres à un Servlet ou à un groupe de Servlet. Les filtres peuvent également être ajoutés aux fichiers JavaServer Pages (JSP) et aux pages HTML.
Les filtres sont des classes Java utilisables pour la programmation Servlet, qui peuvent réaliser les objectifs suivants :
Intercepter ces requêtes avant qu'elles n'accèdent aux ressources backend du client.
Traiter ces réponses avant qu'elles ne soient envoyées au client.
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 délégué de déploiement web (web.xml) et ensuite mappés aux noms de Servlet ou aux motifs d'URL dans la déclaration 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 la déclaration de déploiement.
L'ordre d'exécution des filtres correspond à l'ordre de configuration dans le fichier web.xml, généralement les滤ateurs sont configurés avant tous les 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 :
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 demande du client correspond à l'URL définie par 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) Lors du démarrage d'une application web, le serveur web crée un exemple d'objet Filter et appelle sa méthode init pour lire la configuration web.xml, achever la fonction d'initialisation de l'objet, et se préparer à intercepter 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 actuelles 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>Site de base des tutoriels</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 过滤器有基本的了解,您可以使用相同的概念编写更复杂的过滤器应用程序:
//导入必需的 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" - Base Tutorial Website 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 Nom d'en-tête</th><th Valeur d'en-tête</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 mappez à une URL ou un Servlet, ce qui est similaire à définir un Servlet, puis le mappez à un schéma d'URL. Dans le fichier descriptif de déploiement web.xml Créez l'entrée suivante pour le tag filter dans
<?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>Site de base des tutoriels</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> <!-- du paquet --> <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 manière courante, vous verrez les journaux générés par le serveur Web. Vous pouvez également utiliser Log4J Enregistreur pour enregistrer les journaux ci-dessus dans un fichier distinct.
Ensuite, nous allons accéder à cette adresse d'exemple http://localhost:8080/TomcatTest/DisplayHeader, puis vérifiez le contenu de la console
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 reverser l'ordre des éléments filter dans le fichier web.xml-mapping>élément 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'URL 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 aux requêtes拦截ées par le filtre (style d'URL associé au filtre)
<servlet-name>spécifie le nom du Servlet intercepté par le filtre.
L'élément <dispatcher> spécifie la manière dont le conteneur Servlet appelle les ressources拦截ées par le filtre, qui peut être l'un des suivants : REQUEST, INCLUDE, FORWARD ou ERROR, par défaut REQUEST. L'utilisateur peut définir plusieurs éléments <dispatcher> pour spécifier plusieurs modes d'appel de ressources interceptées par le Filter.
Les 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 accessible via la méthode include() ou forward() de RequestDispatcher, le filtre ne sera pas appelé.
INCLUDE : Si la ressource cible est accessible via la méthode include() de RequestDispatcher, ce filtre sera appelé. Sinon, ce filtre ne sera pas appelé.
FORWARD : Si la ressource cible est accessible via la méthode forward() de RequestDispatcher, ce filtre sera appelé, sinon, ce filtre ne sera pas appelé.
ERROR : Si la ressource cible est appelée par un mécanisme de gestion des exceptions déclaratives, ce filtre sera appelé. Sinon, le filtre ne sera pas appelé.