1. Introduction au filtre
Le filtre est également appelé filtre. C'est la technologie la plus excitante 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.
L'API Servlet fournit une interface filtrante. Lors du développement d'applications Web, si la classe Java écrite implémente cette interface, la classe Java est appelée filtre filtre. Grâce à la technologie Filter, les développeurs peuvent implémenter les demandes et les réponses d'accès des utilisateurs avant d'accéder à une ressource cible, comme indiqué ci-dessous:
2. Comment le filtre intercepte-t-il?
Il existe une méthode Dofilter dans l'interface du filtre. Lorsque nous écrivons le filtre et configurons la ressource Web à intercepter, le serveur Web appellera la méthode Dofilter de 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).
3. Après avoir appelé la ressource cible, laissez un morceau de code exécuter.
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.
3. Début avec le développement du filtre
3.1. Étapes de développement de filtre
Le développement du filtre est divisé en deux étapes:
1. Écrivez une classe Java pour implémenter l'interface de filtre et implémenter sa méthode Dofilter.
2. Utilisez les éléments <filter> et <mappage du filtre> dans le fichier web.xml pour enregistrer la classe de filtre écrite et définir les ressources qu'il peut intercepter.
Exemple de filtre:
package me.gacl.web.filter; import java.io.ioexception; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletException; importer javax.servlet.servletrequest; importation; javax.servlet.servletResponse; / *** @classname: filterDemo * @description: trois applications typiques du filtre: *, vous pouvez décider si vous devez appeler la ressource cible. La ressource cible est exécutée, le résultat d'exécution de la ressource cible peut être capturé, réalisant ainsi certaines fonctions spéciales * @Author: 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 � Response, FilterChain Chain) lance ioException, servlexception {// Veuillez être prétraité sur demande et réponse request.SetcharAtterencoding ("utf -"); réponse.SetcharAtterencoding ("utf -"); réponse.setContentType ("text / html; charset = utf -"); System.out.println ("FilterDemo avant l'exécution !!!"); chain.dofilter (request, réponse); // Laissez la ressource cible exécuter et libérer System.out.println ("FilterDemo après exécution!!");} @ OverRidepublic void destrust () {System.out.println ("---- Filter Destruction ----");}} Configurer les filtres dans web.xml:
<? xml version = "." Encoding = "utf -"?> <web-app version = "." xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w.org//xmlschema-instance" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app__.xsd "> <plaw-name> </ display-name> <ven welcome-file-List> <leen welcome-file> index.jsp </venke-file> </ bienvenue-file-list> <! - Configuration Filter -> <filter> <Filter-Name> FilterDemo </ Filter-Name> <Filter-Class> me.gacl.web.filter.filterdemo </ filter-Classe> </filter> <! - Mapping Filter -> <! - " Demandes -> <url-stern> / * </ url-sattern> </ filter-mapping> </ web-appin>
3.2. 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.
4. Le cycle de vie du filtre
4.1. Création de filtre
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 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. Grâce aux paramètres de la méthode init, un objet FilterConfig représentant les informations de configuration de filtre actuels peut être obtenue.
4.2. Destruction du filtre
Le conteneur Web appelle la méthode Detrère pour détruire le filtre. La méthode de détruire n'est exécutée qu'une seule fois pendant le cycle de vie du filtre. Dans la méthode de détruire, les ressources utilisées par le filtre peuvent être libérées.
4.3. Interface FilterConfig
Lors de la configuration des filtres, les utilisateurs peuvent utiliser <Init-Param> pour configurer certains paramètres d'initialisation pour les filtres. Lorsque le conteneur Web instancie l'objet filtrant et appelle sa méthode d'initiation, l'objet FilterConfig résumant les paramètres d'initialisation du filtre sera transmis. Par conséquent, lorsque les développeurs écrivent des filtres, ils peuvent obtenir:
String getFiltername (): Obtenez le nom du filtre.
String getInitAramètre (nom de chaîne): renvoie la valeur du paramètre d'initialisation avec le nom spécifié dans la description du déploiement. Retour null s'il n'existe pas.
Énumération getInitAmEterternames (): 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.
Exemple: utilisez FilterConfig pour obtenir des informations de configuration de filtre
package me.gacl.web.filter; import java.io.ioexception; import java.util.enumeration; importer javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servlexect; import javax.sservlet.Servlet javax.servlet.servletResponse; public class filterDemo implémente filter {/ * Filter Initialisation * @see javax.servlet.filter # init (javax.servlet.filterconfig) * / @ overdepublic void init (filterconfig filigon Initialisation ---- "); / *** <filter> <filter-name> FilterDemo </filter-Name> <Filter-Class> me.gacl.web.filter.FilterDemo </filter-Class> <! - Configurer les paramètres d'initialisation de FilterDemo Filter -> <init-pARAM> Filter </ Description> <param-name> name </ param-name> <param-valeur> gacl </onsam-valent> </itnit-param> <it-p aram> <escription> Configurez les paramètres d'initialisation de filterDemo Filter </ Description> <Am param-name> like </ param-name> <param-valeur> java </ param-value> </ init-paam> </filter> <! Nom de Filter String Filtername = filterConfig.getFilternAm (); // Obtenez le paramètre d'initialisation configuré dans la chaîne de fichiers web.xml initparam = filterConfig.getInitParAmètre ("name"); String initparam = filterconfig.getInitParameter ("like"); // renvoie un ensemble d'énumération de noms de tous les paramètres d'initialisation du filtre. Enumeration <string> InitParameTernames = filterConfig.getInitParameTernames (); System.out.println (filteraMe); System.out.println (initparam); System.out.println (initparam); System.out.println (initparam); while (initParameTernaMes.HasmoreElements ()) {String paramname = (String) initparAmEterNames.NextElement (); System.out.println (paramname);}} @ OverRidepublic void Dofilter (ServletReQuest Request, ServLetResponse Response, FileterChain Chain) Throws ioException, servletException. {System.out.println ("FilterDemo avant l'exécution !!!"); chain.dofilter (demande, réponse); // Laissez la ressource cible être exécutée et System.out.println ("filterDemo après l'exécution !!!");} @ OverRidepublic void destrust () {System.out.println ("--- Destructions de filtre ----");}} 5. Déploiement du filtre
Le déploiement du filtre est divisé en deux étapes:
1. Registre du filtre
2. Filtre de cartographie
5.1. Enregistrer le filtre
Après avoir développé un filtre, vous devez vous inscrire dans le fichier web.xml afin que vous puissiez être appelé par le serveur Web.
Enregistrez l'exemple de filtre dans le fichier web.xml:
<filter> <escription> FilterDemo Filter </ Description> <Filter-Name> FilterDemo </filter-Name> <Filter-Class> me.gacl.web.filter.FilterDemo </ Filter-Class> <! - Configurer les paramètres d'initialisation de FilterDemo Filter -> </ init-pataM> RIPT> <AMAM-NAME> NOM </ PARAM-NAME> <AMAM-VALUE> GACL </AMAM-VALUE> </IniT-PARAM> <IniT-PARAM> <Description> Configurez les paramètres d'initialisation du filtre FilterDemo </ Description> <AmAn-Name> Like </ Param-name> <Param-Value> Java </Aram-Value>
<escription> est utilisé pour ajouter des informations de description. Le contenu de cet élément peut être vide et <escription> ne peut pas être configuré.
<Filter-Name> est utilisé pour spécifier un nom pour le filtre, et le contenu de l'élément ne peut pas être vide.
L'élément <filtre-Class> est utilisé pour spécifier le nom de classe qualifié complet du filtre.
L'élément <Init-Param> est utilisé pour spécifier les paramètres d'initialisation pour le filtre, et son élément enfant <AMAM-NAME> spécifie le nom du paramètre et <Amam-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. Si le filtre n'a pas besoin de spécifier les paramètres d'initialisation, l'élément <Init-Param> peut ne pas être configuré.
5.2. Filtre à cartographie
Après avoir enregistré le filtre dans le fichier web.xml, vous devez également mapper le filtre dans le fichier web.xml
<! - Mapping Filter -> <Filter-Mapping> <Filter-Name> FilterDemo </ Filter-Name> <! - "/ *" signifie intercepter toutes les demandes -> <Url-Pattern> / * </ url-Pattern> </ Filter-Mapping>
L'élément <filter-mapping> est utilisé pour définir la ressource qu'un 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.
L'élément enfant <filter-name> est utilisé pour définir le nom d'enregistrement du filtre. Cette valeur doit être le nom du filtre déclaré dans l'élément <url-sattern>. Définissez le chemin de demande intercepté par filtre (le style URL associé au filtre)
<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
Filtre intercepte diverses façons d'appeler les ressources. comme suit:
<Lifter-Mapping> <Filter-Name> TestFilter </ Filter-Name> <Url-Pattern> /Index.jsp </url-Pattern> <Spatcher> Request </spatcher> <padipatcher> Forward </ Dispatcher> </filter-Mapping>
Les valeurs que l'élément enfant peut définir et leur signification:
1.Request: Lorsque l'utilisateur accède directement à la page, le conteneur Web appellera le filtre. Si la ressource cible est accessible via la méthode Inclut () ou Forward () du requestDispatcher, le filtre ne sera pas appelé.
2. inclure: si la ressource cible est accessible via la méthode include () de requestDispatcher, le filtre sera appelé. En dehors de cela, le filtre ne sera pas appelé.
3.Fairi: si la ressource cible est accessible via la méthode Forward () de demandedispatcher, le filtre sera appelé et le filtre ne sera pas appelé en plus.
4.Error: Si la ressource cible est appelée via le mécanisme de traitement des exceptions déclaratifs, le filtre sera appelé. En dehors de cela, le filtre ne sera pas appelé.