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érie | Méthode et description | ||||||||
---|---|---|---|---|---|---|---|---|---|
1 |
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>