Introduction au filtre
Le filtre est également appelé filtre. C'est la technologie la plus pratique de la technologie des servlet. Grâce à la technologie des filtres, les développeurs Web interceptent toutes les ressources Web gérées par des serveurs Web: tels que JSP, servlet, fichiers d'image statiques ou fichiers HTML statiques, atteignant ainsi certaines fonctions spéciales. Par exemple, implémentez certaines fonctions avancées telles que le contrôle d'accès à l'autorisation de niveau URL, le filtrage du vocabulaire sensible et la compression des informations de réponse.
Il est principalement utilisé pour prétraiter les demandes des utilisateurs et peut également post-processus httpservletResponse. Le processus complet d'utilisation de Filter: Filtre Prétranges de demandes d'utilisateur, puis remettez la demande au servlet pour le traitement et génère une réponse, et enfin filtrez les post-traitements de la réponse du serveur.
Fonction de filtre
1. Intercepter le HTTPServletRequest du client avant l'arrivée du servlet. Vérifiez le HTTPServLetRequest selon les besoins, et vous pouvez également modifier l'en-tête et les données HTTPServletRequest.
2. Intercepter httpservletResponse avant d'atteindre le client. Vérifiez HttpServletResponse selon les besoins, et vous pouvez également modifier l'en-tête et les données HTTPServletResponse.
Comment utiliser le filtre pour implémenter la fonction d'interception
Il existe une méthode Dofilter dans l'interface du filtre. Lorsque le développeur écrit le filtre et configure la ressource Web à intercepter, le serveur Web appellera la méthode Dofilter du filtre à chaque fois avant d'appeler la méthode de service de la ressource Web. Par conséquent, l'écriture de code dans cette méthode peut atteindre l'objectif suivant:
1. Laissez un morceau de code exécuter avant d'appeler la ressource cible.
2. Que ce soit pour appeler la ressource cible (c'est-à-dire si vous devez permettre aux utilisateurs d'accéder à la ressource Web).
Lorsque le serveur Web appelle la méthode Dofilter, il passera un objet FilterChain. L'objet FilterChain est l'objet le plus important de l'interface de filtre. Il fournit également une méthode Dofilter. Les développeurs peuvent décider d'appeler cette méthode en fonction de leurs besoins. Si cette méthode est appelée, le serveur Web appellera la méthode de service de la ressource Web, c'est-à-dire que la ressource Web sera accessible, sinon la ressource Web ne sera pas accessible.
Développement de filtre deux étapes
Écrivez une classe Java pour implémenter l'interface de filtre et implémenter sa méthode Dofilter.
Utilisation et éléments dans le fichier web.xml pour enregistrer la classe de filtre écrite et définir les ressources qu'il peut intercepter.
Introduction aux nœuds de configuration web.xml:
L'élément <filter-mapping> est utilisé pour définir la ressource selon laquelle le filtre est responsable de l'interception. Un filtre intercepte une ressource peut être spécifiée de deux manières: le nom du servlet et le chemin de demande d'accès aux ressources.
<Servlet-Name> Spécifie le nom du servlet intercepté par le filtre.
<padipatcher> Spécifie la façon dont la ressource interceptée par le filtre est appelée par le conteneur servlet. Il peut s'agir d'une des demandes, d'inclure, de transfert et d'erreur, et la demande par défaut. Les utilisateurs peuvent définir plusieurs sous-éléments <patcher> pour spécifier le filtre pour intercepter diverses façons d'appeler des ressources.
La valeur et sa signification que l'élément enfant peut définir est le suivant
Chaîne de filtre
Dans une application Web, plusieurs filtres peuvent être développés et écrits, qui sont combinés en une seule chaîne de filtre.
Le serveur Web décide quel filtre appelle d'abord en fonction de la commande dans laquelle le filtre est enregistré dans le fichier web.xml. Lorsque la méthode Dofilter du premier filtre est appelée, le serveur Web créera un objet FilterChain représentant la chaîne de filtre et le transmet à la méthode. Dans la méthode Dofilter, si le développeur appelle la méthode Dofilter de l'objet FilterChain, le serveur Web vérifiera s'il existe toujours un filtre dans l'objet FilterChain. S'il y en a, le deuxième filtre est appelé, et s'il n'y a pas, la ressource cible est appelée.
Cycle de vie du filtre
public void init (filterconfig filterConfig) lève ServletException; // initialisation
Comme le programme de servlet que nous écrivons, la création et la destruction du filtre sont la responsabilité du serveur Web. Lorsque l'application Web est démarrée, le serveur Web créera un objet d'instance de filtre et appellera sa méthode init pour lire la configuration Web.xml pour compléter la fonction d'initialisation de l'objet, se préparant ainsi à l'interception pour les demandes utilisateur ultérieures (l'objet filtrant 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 un objet FilterConfig représentant les informations de configuration de filtre actuelles via les paramètres de la méthode INIT.
Public Void Dofilter (ServletRequest Request, ServletResponse Response, FilterChain Chain) lève IOException, ServletException; // demande d'interception
Cette méthode complète l'opération de filtrage réelle. Lorsque le client demande l'accès à l'URL associé au filtre, le filtre servlet exécutera d'abord la méthode Dofilter. Le paramètre FilterChain est utilisé pour accéder aux filtres ultérieurs.
public void détruire (); // détruire
L'objet filtrant résidera en mémoire après la création et sera détruit lorsque l'application Web sera supprimée ou que le serveur est arrêté. Appelé avant le conteneur Web désinstalle l'objet filtrant. Cette méthode n'est exécutée qu'une seule fois pendant le cycle de vie du filtre. Dans cette méthode, les ressources utilisées par le filtre peuvent être libérées.
Interface FilterConfig
Lors de la configuration des filtres, les utilisateurs peuvent configurer certains paramètres d'initialisation pour les filtres. Lorsque le conteneur Web instancie l'objet filtrant et appelle sa méthode init, il passera dans l'objet FilterConfig qui résume les paramètres d'initialisation du filtre. Par conséquent, lorsque les développeurs écrivent des filtres, ils peuvent obtenir le contenu suivant via la méthode d'objet FilterConfig:
String getFiltername (); // Obtenez le nom du filtre. String getInitParameter (nom de chaîne); // renvoie la valeur du paramètre d'initialisation avec le nom spécifié dans la description du déploiement. S'il n'y a pas d'existence, retournez null. Énumération getInitParameTernames (); // Renvoie un ensemble d'énumération de noms de tous les paramètres d'initialisation du filtre. public servletContext getServletContext (); // renvoie une référence à l'objet de contexte servlet.
Filtre les cas d'utilisation
Utilisez le filtre pour vérifier le contrôle de sécurité de la connexion de l'utilisateur
J'ai participé au maintien d'un projet il y a quelque temps. Après que l'utilisateur ait quitté le système, il est allé à la barre d'adresse pour accéder à l'historique. Selon l'URL, il pouvait toujours saisir la page de réponse système. J'ai vérifié et constaté que la demande n'a pas été filtrée et vérifié que la connexion de l'utilisateur était connectée. Ajoutez un filtre pour résoudre le problème!
Configurez-le 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 filtrez pas la page de connexion -> <param-value> /project/index.jsp ;login.dodo </ param-value> </1nit-Param> <Init-Param> <Am param-name> IncludeStrings </ Param-name> <! - Filtrez uniquement le suffixe du paramètre de filtre spécifié -> <param-value> .do; .jsp </ param-value> </nitinit-param> <Init-Param> <param-name> RedirectPath </ paramn-name> <! - Pas via l'interface de rogne à percer <Am param-Value> /Index.jsp </ Param-Value> </ Init-Param> <Init-Param> <Amam-Name> DisableTestFilter </ Param-Name> <! - Y: Invalid Filter -> <Ar param-value> n </ param-value> <! - http://www.manongjc.com/article/1613. </nitt-Param> </filter> <Imlter-Mapping> <Filter-Name> SessionFilter </filter-name> <URL-Pattern> / * </url-potern> </filter-mapping>
Ensuite, écrivez filterServlet.java:
package com.action.login; importer java.io.ioexception; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletException; import javax.serReRestern javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; import javax.servlet.http.httpservrasseponsewrapper; / ** * déterminer si l'utilisateur est enregistré et si elle n'est pas enregistrée dans, exit le système * http://www.manongjc.com/article/1613.html * / public class SessionFilter implémente filter {public filterConfig config; public void destre () {this.config = null; } public static boolean isContains (String Container, String [] regx) {booléen result = false; for (int i = 0; i <regx.length; i ++) {if (contener.indexof (rex [i])! = -1) {return true; }} Retour Résultat; } public void dofilter (ServLetRequest Request, ServletResponse Response, filterChain Chain) lève ioException, servlexception {httpservletRequest hrequest = (httpservletRequest) request; HttpservletResponseWrapper wrapper = new httpservletResponsewrapper ((httpservletResponse)); String Logonstrings = config.getInitParameter ("Logonstrings"); // Connexion à la chaîne de page de connexion IncludeStrings = config.getInitParameter ("Includestrings"); // Filter Resource Suffix Paramètres String redirectPath = hrequest.getContextPath () + config.getInitParAmètre ("redirectPath"); // pas de connexion à la chaîne de page de virage DisableTestFilter = config.getInitParameter ("DisableTestFilter"); // Le filtre est-il valide if (DisableTestFilter.ToupperCase (). retour; } String [] logonlist = logonstrings.split (";"); String [] includeList = includeStrings.split (";"); if (! this.isConTains (hrequest.getRequeSturi (), includeList)) {// Filtrez uniquement le suffixe de paramètre de filtre spécifié chaîne.Dofilter (demande, réponse); retour; } if (this.isConTains (hrequest.getRequeSturi (), Logonlist)) {// Ne filtrez pas la page de connexion chaîne.dofilter (demande, réponse); retour; } String User = (String) hRequest.getSession (). GetAtTribute ("userOnly"); // juger si l'utilisateur est connecté à if (user == null) {wrapper.sendRedirect (redirectPath); retour; } else {chain.dofilter (demande, réponse); retour; }} public void init (filterConfig filterConfig) lève ServletException {config = filterConfig; }}De cette façon, toutes les demandes à l'utilisateur peuvent être remplies et la connexion de l'utilisateur doit être vérifiée via ce filtre.
Empêcher les filtres brouillés chinois
Lorsque le projet utilise le framework Spring. Lorsque différents jeux de caractères sont utilisés dans la page JSP actuelle et le code Java pour l'encodage, il y aura des problèmes brouillés avec les données soumises par formulaire ou le téléchargement / téléchargement des fichiers de nom chinois. Ensuite, vous pouvez utiliser ce filtre.
<filter> <filter-name> codage </ filter-name> <filter-class> org.springframework.web.filter.characterencodingfilter </filter-Class> <Init-Name> Encoding </ Param-name> <! --- Utilisé pour spécifier un ensemble de caractères spécifique -> <param-valeur> </nitt-param> <it-param> <param-name> Forceencoding </onsam-name> <! - Vrai: Peu importe si la demande a spécifié un jeu de caractères, le codage est utilisé; FAUX: Si la demande a spécifié un jeu de caractères, le codage n'est pas utilisé -> <param-Value> False </ Param-Value> </Init-Param> </filter> <Imlter-Mapping> <Filter-Name> Encoding </filter-name> <Url-Pattern> / * </url-Pattern> </filter-mapping>
Spring + Hibernate's OpenSessionInViewFilter contrôle le commutateur de la session
Lorsque Hibernate + Spring est utilisé en conjonction avec celui-ci, si Lazy = true est défini (chargement retardé), lors de la lecture des données, Hibernate ferme automatiquement la session après la lecture des données des parents. De cette façon, lorsque vous souhaitez utiliser les données et les données des enfants associées, le système lancera une erreur LazyInit. Pour le moment, vous devez utiliser le filtre OpenSessionInViewFilter fourni par Spring.
OpenSessionInViewFilter maintient principalement l'état de session jusqu'à ce que la demande envoie toutes les pages au client et ne ferme pas la session jusqu'à la fin de la demande, afin de résoudre les problèmes causés par le chargement paresseux.
Remarque: La configuration OpenSessionInViewFilter doit être écrite devant la configuration de Struts2. Étant donné que le conteneur Tomcat est chargé en séquence lors du chargement du filtre, si le fichier de configuration écrit d'abord la configuration du filtre de Struts2, puis la configuration du filtre OpenSessionInViewFilter, l'ordre de chargement entraîne la session qui n'est pas géré par Spring lors de l'obtention de données.
<filter> <! - Chargement paresseux activé dans Spring -> <Filter-Name> OpenSessionInViewFilter </ Filter-Name> <Filter-Class> org.SpringFramework.OrM.HiberNate3.Support.OpenSessionInViewFilter </ Filter-Class> <init-Param> <param-name> SessionFactoryBeanname </ Param-Name> <! Par défaut, le bean avec ID en tant que SessionFactory du conteneur de ressort. Si l'ID n'est pas SessionFactory, vous devez le configurer comme suit. Ici, le SessionFactory est le haricot dans le récipient à ressort. -> <Am param-Value> SessionFactory </ Param-Value> </Init-Param> <Init-Param> <Amam-Name> SingleSession </ Param-Name> <! - SingleSession par défaut est true, si défini sur False, il est égal à aucune utilisation d'OpenSessioninView -> <Ar param-Value> true </ param-valeur> <filter-name> openssesseInViewFilter </filter-name> <url-stern> *. do </url-sattern> </filter-mapping>
Configuration Web.xml de Struts2
Pour utiliser Struts2 dans le projet, vous devez également configurer un filtre dans web.xml pour intercepter les demandes et accéder à l'action de Struts2 pour le traitement.
Remarque: Si dans la version Struts2 avant 2.1.3, le filtre utilise org.apache.struts2.dispatcher.filterdispatcher. Sinon, utilisez org.apache.struts2.dispatcher.ng.filter.strutsprepareandexEcuteFilter. En commençant par Struts 2.1.3, le filtre ActionContextCleanup sera abandonné, tandis que la fonctionnalité correspondante est incluse dans le filtre StruTSprepareAndexEcuteFilter.
Trois paramètres d'initialisation sont configurés:
<! - Struts 2.x Filter -> <filter> <Filter-Name> Struts2 </ Filter-Name> <Filter-Class> org.apache.struts2.dispatcher.ng.filter.strutspareAndexecuteFilter </ filter-Class> </filter> <filter> <filtre-name> <url-sattern> *. do </ url-stern> </filter-mapping>
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!