English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introduction au Filter
Le Filter, également appelé filtre, est l'une des techniques les plus pratiques de la technologie Servlet. Les développeurs Web utilisent la technologie Filter pour intercepter tous les resources gérés par le serveur web : par exemple, Jsp, Servlet, fichiers d'images statiques ou fichiers html statiques, etc., afin de réaliser des fonctionnalités spéciales. Par exemple, la contrôle d'accès aux niveaux d'URL, le filtrage des mots sensibles, la compression des informations de réponse, etc. des fonctionnalités avancées.
Il est principalement utilisé pour la prétraitement des demandes des utilisateurs et peut également effectuer des traitements après la réponse du serveur. Le flux complet d'utilisation du Filter : le Filter effectue le prétraitement des demandes des utilisateurs, puis transmet la demande au Servlet pour traitement et génération de la réponse, et enfin, le Filter effectue le traitement après la réponse du serveur.
Fonction du Filter
Intercepter l'HttpServletRequest avant qu'il ne soit envoyé au Servlet. Selon les besoins, vérifier l'HttpServletRequest et modifier l'en-tête et les données de l'HttpServletRequest.
Intercepter l'HttpServletResponse avant qu'elle ne soit envoyée au client. Selon les besoins, vérifier l'HttpServletResponse et modifier l'en-tête et les données de l'HttpServletResponse.
Comment utiliser Filter pour réaliser la fonction d'interception
L'interface Filter contient une méthode doFilter. Lorsque les développeurs ont terminé l'écriture du Filter et configuré l'interception de quel resource web, le serveur web appelle d'abord la méthode doFilter du Filter avant de chaque appel à la méthode service du resource web. Par conséquent, il est possible d'atteindre les objectifs suivants en écrivant du code dans cette méthode :
Exécuter un segment de code avant d'appeler la ressource cible.
Appeler ou non la ressource cible (c'est-à-dire permettre ou non à l'utilisateur d'accéder au resource web).
Le serveur web, lors de l'appel à la méthode doFilter, transmet un objet filterChain, qui est l'un des objets les plus importants de l'interface filter. Il fournit également une méthode doFilter, que les développeurs peuvent appeler ou non selon leurs besoins. Si cette méthode est appelée, le serveur web appellera la méthode service du resource web, c'est-à-dire que le resource web sera visité; sinon, le resource web ne sera pas visité.
Deux étapes pour le développement de Filter
Écrivez une classe java qui implémente l'interface Filter et implémente sa méthode doFilter.
Enregistrez la classe filter écrite dans le fichier web.xml et configurez les ressources qu'elle peut intercepter.
Introduction des différents nœuds de configuration web.xml :
Chaîne de Filter
Dans une application web, il est possible de développer plusieurs Filter, ces Filter combinés forment une chaîne de Filter.
Le serveur web décide de l'ordre d'appel des Filter en fonction de l'ordre d'enregistrement du Filter dans le fichier web.xml. Lorsque la méthode doFilter du premier Filter est appelée, le serveur web crée un objet FilterChain représentant la chaîne de Filter et le passe à cette méthode. Dans la méthode doFilter, si le développeur appelle la méthode doFilter de l'objet FilterChain, le serveur web vérifie s'il y a d'autres filter dans l'objet FilterChain. S'il y en a, il appelle le prochain filter.2un filter, s'il n'y en a pas, appelle la ressource cible.
Cycle de vie du Filter
public void init(FilterConfig filterConfig) throws ServletException;//Initialisation
Comme nos programmes Servlet, la création et la destruction du Filter sont gérées par le serveur web. Lors du lancement de l'application web, le serveur web crée une instance de Filter, appelle sa méthode init, lit la configuration web.xml et complète la fonction d'initialisation de l'objet, en préparant ainsi l'interception des demandes utilisateur ultérieures (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.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//Intercepter la requête
Cette méthode effectue l'opération de filtrage réelle. Lorsque le client demande d'accéder à l'URL associée au filtre, le filtre Servlet exécute d'abord la méthode doFilter. Le paramètre FilterChain est utilisé pour accéder aux filtres suivants.
public void destroy();//Destruction
Après la création du Filter objet restera en mémoire, jusqu'à ce que l'application web soit supprimée ou que le serveur s'arrête, puis il est détruit. Appelé avant que le conteneur Web ne décharge l'objet Filter. Cette méthode ne s'exécute qu'une fois dans le cycle de vie du Filter. Dans cette méthode, vous pouvez libérer les ressources utilisées par le Filter.
Interface FilterConfig
Lorsque l'utilisateur configure le filtre, il peut configurer des paramètres d'initialisation pour le filtre. Lorsque le conteneur web instancie l'objet Filter, il appelle la méthode init et transmet l'objet filterConfig encapsulé les paramètres d'initialisation du filtre. Par conséquent, les développeurs peuvent obtenir le contenu suivant en écrivant le filtre via les méthodes de l'objet filterConfig :
String getFilterName();//Obtenez le nom du filtre. String getInitParameter(String name);//Retournez la valeur du paramètre d'initialisation spécifié dans la description de déploiement. Si il n'existe pas, retournez null. Enumeration getInitParameterNames();//Retournez une collection d'ensembles d'enumération des noms de paramètres d'initialisation de tous les filtres. public ServletContext getServletContext();//Retournez une référence à l'objet ServletContext.
Cas d'utilisation du Filter
Utilisez Filter pour vérifier la sécurité de la connexion utilisateur
Récemment, j'ai participé à la maintenance d'un projet, après que l'utilisateur ait quitté le système, si vous accédez à l'historique de l'adresse en barre, selon l'url, vous pouvez toujours entrer dans la page de réponse du système. J'ai vérifié et découvert que les demandes n'ont pas été filtrées et vérifiées pour l'authentification utilisateur. Ajoutez un filtre pour résoudre le problème !
Configurez d'abord dans web.xml
<filter> <filter-name>SessionFilter</filter-name> <filter-class>com.action.login.SessionFilter</filter-class> <init-param> <param-name>logonStrings</param-name><!-- ne pas filtrer la page de connexion --> <param-value>/project/index.jsp;login.do</param-value> </init-param> <init-param> <param-name>includeStrings</param-name><!-- ne filtrer que les paramètres de filtre spécifiés --> <param-value>.do;.jsp</param-value> </init-param> <init-param> <param-name>redirectPath</param-name><!-- Non-approuvé, redirigez vers l'interface de connexion --> <param-value>/index.jsp</param-value> </init-param> <init-param> <param-name>disabletestfilter</param-name><!-- Y: Filtrage inefficace --> <param-value>N</param-value> </init-param> </filter> <filter-mapping> <filter-name>SessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Ensuite, écrivez FilterServlet
package com.action.login; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; /** * Vérifier si l'utilisateur est connecté, sinon quitter le système */ public class SessionFilter implements Filter { public FilterConfig config; public void destroy() { this.config = null; } public static boolean isContains(String container, String[] regx) { boolean result = false; for (int i = 0; i < regx.length; i++) { if (container.indexOf(regx[i]) != -1) { return true; } } return result; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest hrequest = (HttpServletRequest)request; HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response); String logonStrings = config.getInitParameter("logonStrings"); // page de connexion de connexion String includeStrings = config.getInitParameter("includeStrings"); // filtrer les paramètres de suffixe de ressource String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// rediriger vers la page de redirection si non connecté String disabletestfilter = config.getInitParameter("disabletestfilter");// le filtre est-il valide if (disabletestfilter.toUpperCase().equals("Y")) { // filtrage non valide chain.doFilter(request, response); return; } String[] logonList = logonStrings.split(";"); String[] includeList = includeStrings.split(";"); if (!this.isContains(hrequest.getRequestURI(), includeList)) {// ne filtrer que les paramètres de filtre spécifiés chain.doFilter(request, response); return; } if (this.isContains(hrequest.getRequestURI(), logonList)) {// ne pas filtrer la page de connexion chain.doFilter(request, response); return; } String user = ( String ) hrequest.getSession().getAttribute("useronly");//vérifier si l'utilisateur est connecté if (user == null) { wrapper.sendRedirect(redirectPath); return; }else { chain.doFilter(request, response); return; } } public void init(FilterConfig filterConfig) throws ServletException { config = filterConfig; } }
De cette manière, toutes les demandes de l'utilisateur doivent être vérifiées par ce Filter pour la connexion de l'utilisateur.
Filtre anti-caractères chinois malformés
Lorsque le projet utilise le cadre Spring. Lorsque les pages JSP de l'interface utilisateur et le code Java utilisent différents jeux de caractères pour l'encodage, des données de soumission de formulaire ou des/Problème de caractères malformés lors du téléchargement de fichiers de nom chinois, vous pouvez utiliser ce filtre.
<filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name><!--Utilisé pour spécifier un jeu de caractères spécifique--> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name><!--true : que le request spécifie ou non un jeu de caractères, utilisez toujours encoding ; false : si le request a spécifié un jeu de caractères, n'utilisez pas encoding--> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Voici la totalité du contenu de cet article, j'espère qu'il vous aidera dans vos études, et j'espère que vous soutiendrez également le tutoriel d'encouragement.
Déclaration : le contenu de cet article est issu du réseau, et appartient aux auteurs originaux. Le contenu est contribué et téléversé par les utilisateurs d'Internet, ce site n'appartient pas aux droits de propriété intellectuelle, n'a pas été traité par l'éditeur humain et n'assume pas la responsabilité juridique connexe. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, le site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)