Einführung in den Filter
Der Filter wird auch als Filter bezeichnet. Es ist die praktischste Technologie in der Servlet -Technologie. Durch die Filtertechnologie fangen Webentwickler alle von Webservern verwalteten Webressourcen ab: wie JSP, Servlet, statische Bilddateien oder statische HTML -Dateien, wodurch einige spezielle Funktionen erzielt werden. Implementieren Sie beispielsweise einige erweiterte Funktionen wie URL-Ebene auf Berechtigungszugriffskontrolle, filtern sensitives Vokabular und Komprimierungsinformationen.
Es wird hauptsächlich zur Vorbereitung von Benutzeranfragen verwendet und kann auch HttpServletResponse nach dem Prozess nach dem Prozess verarbeiten. Der vollständige Verfahren der Verwendung von Filter: Filtervorverhandlungen Benutzeranfragen, übergeben Sie die Anforderung an das Servlet zur Verarbeitung und generieren eine Antwort und filtern schließlich nach der Verarbeitung der Serverantwort.
Filterfunktion
1. Abfangen das httpServletRequest des Kunden, bevor der httpServletRequest im Servlet ankommt. Überprüfen Sie nach Bedarf den HttpServletRequest und Sie können auch den Header und die Daten von httpServletRequest ändern.
2. Abfangen httpServletResponse, bevor er den Client erreicht. Überprüfen Sie nach Bedarf HttpServletResponse, und Sie können auch den Header und die Daten von HttpServletResponse ändern.
So verwenden Sie den Filter, um die Abfangenfunktion zu implementieren
Es gibt eine Dofiltermethode in der Filterschnittstelle. Wenn der Entwickler den Filter schreibt und konfiguriert, welche Webressourcen abfangen sollen, ruft der Webserver jedes Mal die Dofilter -Methode des Filters auf, bevor er die Servicemethode der Webressource aufruft. Daher kann das Schreiben von Code in dieser Methode den folgenden Zweck erreichen:
1. Lassen Sie einen Code ausführen, bevor Sie die Zielressource aufrufen.
2. Ob Sie die Zielressource aufrufen möchten (dh, ob Benutzer auf die Webressource zugreifen können).
Wenn der Webserver die Dofilter -Methode aufruft, wird ein Filterchain -Objekt eingelegt. Das Filterchain -Objekt ist das wichtigste Objekt in der Filterschnittstelle. Es bietet auch eine Dofilter -Methode. Entwickler können entscheiden, ob sie diese Methode entsprechend ihren Bedürfnissen bezeichnen sollen. Wenn diese Methode aufgerufen wird, ruft der Webserver die Servicemethode der Webressource auf, dh auf die Webressource wird zugegriffen, andernfalls wird auf die Webressource nicht zugegriffen.
Filterentwicklung zwei Schritte
Schreiben Sie eine Java -Klasse, um die Filterschnittstelle zu implementieren und ihre Dofilter -Methode zu implementieren.
Verwenden und Elemente in der Datei web.xml zum Registrieren der schriftlichen Filterklasse und festlegen, die die Ressourcen abfangen können.
Einführung in Web.xml -Konfigurationsknoten:
Das <filtermapping> Element wird verwendet, um die von Filter verantwortliche Ressource festzulegen. Ein Filter fällt ab, eine Ressource kann auf zwei Arten angegeben werden: den Servlet -Namen und den Anforderungspfad für den Ressourcenzugriff.
<servlet-name> Gibt den Namen des vom Filter abgefangenen Servlet an.
<Isconther> Gibt an, wie die vom Filter abgefangene Ressource vom Servlet -Container aufgerufen wird. Es kann sich um eine Anfrage, die Vorwärts- und Irrtum und die Standardanforderung handeln. Benutzer können mehrere Subelemente für die <Dispatcher> so festlegen, dass Filter angeben, um verschiedene Arten des Aufrufens von Ressourcen abzufangen.
Der Wert und seine Bedeutung, die das untergeordnete Element festlegen kann, lautet wie folgt
Filterkette
In einer Webanwendung können mehrere Filter entwickelt und geschrieben werden, die zu einer Filterkette kombiniert werden.
Der Webserver entscheidet, welcher Filter zuerst gemäß der Reihenfolge, in der der Filter in der Datei web.xml registriert ist, anrufen soll. Wenn die Dofilter -Methode des ersten Filters aufgerufen wird, erstellt der Webserver ein Filterchain -Objekt, das die Filterkette darstellt und an die Methode übergibt. Wenn der Entwickler in der Dofilter -Methode die Dofilter -Methode des Filterchain -Objekts aufruft, prüft der Webserver, ob im Filterchain -Objekt noch ein Filter vorhanden ist. Wenn es vorhanden ist, wird der zweite Filter aufgerufen, und wenn es keine gibt, wird die Zielressource aufgerufen.
Der Lebenszyklus des Filters
öffentliche void init (filterconfig filterconfig) löst servletException aus; // Initialisierung
Wie das von uns geschriebene Servlet -Programm liegt die Erstellung und Zerstörung des Filters in der Verantwortung des Webservers. Wenn die Webanwendung gestartet wird, erstellt der Webserver ein Instanzobjekt von Filter und ruft seine Init -Methode auf, um die Web.xml -Konfiguration zu lesen, um die Funktion der Objektinitialisierung zu vervollständigen, wodurch das Abfangen für nachfolgende Benutzeranforderungen vorbereitet wird (das Filterobjekt wird nur einmal erstellt und die Init -Methode wird nur einmal ausgeführt). Entwickler können das Filterconfig -Objekt erhalten, das die aktuellen Filterkonfigurationsinformationen über die Parameter der Init -Methode darstellt.
Public Void Dofilter (ServletRequest Request, ServletResponse -Antwort, Filterchain -Kette) löst IoException, ServletException aus; // Intercept -Anfrage
Diese Methode vervollständigt den tatsächlichen Filtervorgang. Wenn der Client Zugriff auf die dem Filter zugeordnete URL anfordert, führt der Servlet -Filter zunächst die Dofilter -Methode aus. Der Filterchain -Parameter wird verwendet, um auf nachfolgende Filter zuzugreifen.
öffentliche Leere zerstören (); // zerstören
Das Filterobjekt befindet sich nach der Erstellung im Speicher und wird zerstört, wenn die Webanwendung entfernt wird oder der Server gestoppt wird. Angerufen, bevor der Webcontainer das Filterobjekt deinstalliert. Diese Methode wird nur einmal während des Lebenszyklus des Filters ausgeführt. Bei dieser Methode können die vom Filter verwendeten Ressourcen befreit werden.
Filterconfig -Schnittstelle
Bei der Konfiguration von Filtern können Benutzer einige Initialisierungsparameter für Filter konfigurieren. Wenn der Web -Container das Filterobjekt instanziiert und seine Init -Methode aufruft, wird das Filterconfig -Objekt übergeben, das die Parameter der Filterinitialisierung zusammenfasst. Wenn Entwickler Filter schreiben, können sie daher den folgenden Inhalt über die FilterConfig -Objektmethode erhalten:
String GetFiltername (); // Holen Sie sich den Filternamen. String GetInitParameter (String -Name); // Gibt den Wert des Initialisierungsparameters mit dem in der Beschreibung der Bereitstellung angegebenen Namen zurück. Wenn es keine Existenz gibt, kehren Sie NULL zurück. Enumeration GetInitParameternames (); // gibt einen Aufzählungsatz von Namen aller Initialisierungsparameter des Filters zurück. public servletContext getServletContext (); // Gibt einen Verweis auf das Servlet -Kontextobjekt zurück.
Filternutzungsfälle
Verwenden Sie den Filter, um die Sicherheitsregelung der Benutzeranmeldung zu überprüfen
Ich habe vor einiger Zeit an der Aufrechterhaltung eines Projekts teilgenommen. Nachdem der Benutzer das System verlassen hatte, ging er in die Adressleiste, um auf den Verlauf zuzugreifen. Laut der URL konnte er immer noch die Systemreaktionsseite eingeben. Ich überprüfte und stellte fest, dass die Anfrage nicht gefiltert und verifiziert wurde, dass die Benutzeranmeldung angemeldet wurde. Fügen Sie einen Filter hinzu, um das Problem zu lösen!
Konfigurieren Sie es zuerst in web.xml
<Filter> <filter-name> SessionFilter </filter-name> <filterklasse> com.action.login.SessionFilter </Filter-Class> <init-param> <PARAM-NAME> logonstrings </param-name> <!-Filter nicht die Login-Seite-> <param-value> /project//project/jspex.jsp; <init-param> <param-name> includeStrings </param-name> <!-Filter nur das angegebene Filterparameter-Suffix-> <param-value> .do; <param-value> /Index.jsp </param-value> </init-param> <init-param> <param-name> deaktiviertestFilter </param-name> <!-y: Ungültiger Filter-> <Param-value> n </param-value> <! </init-param> </filter> <filter-mapping> <filter-name> sessionsfilter </filter-name> <URL-Muster>/*</url-puftern> </filter-mapping>
Schreiben Sie dann FilterServlet.java:
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; importieren javax.servlet.http.httpServletResponse; importieren javax.servlet.http.htttpServletresponse; http://www.manongjc.com/article/1613.html */public Class SessionFilter implementiert Filter {public filterConfig config; public void destroy () {this.config = null; } public static boolean iscontains (String Container, String [] Regx) {boolean result = false; für (int i = 0; i <regx.length; i ++) {if (container.indexof (regx [i])! = -1) {return true; }} Rückgabeergebnis; } public void dofilter (ServletRequest -Anfrage, ServletResponse -Antwort, Filterchain -Kette) löst IOException, ServletException {httpServletRequest hrequest = (httpServletRequest) an; HttpServletResponsewrapper Wrapper = new httpServletResponseWrapper ((httpServletResponse) Antwort); String logonstrings = config.GetInitParameter ("Logonstings"); // Anmeldung auf Anmeldeseitenzeichenfolge includeStrings = config.getInitParameter ("IncludeStrings"); // Filterressourcen -Suffix Parameter String redirectPath = hrequest.getContextPath () + config.getInitParameter ("redirectPath"); // Keine Anmeldung zur Turn -Page -String -Deaktivierung von DeIlabletestFilter = config.GetInitParameter ("DeSablETestFilter"); // ist der Filter gültig if (deaktiviertestFilter.touppercase (). Equals ("y") {// Invalid Chain.doFilter (Anfrage, Antwort); zurückkehren; } String [] logonList = logonstrings.split (";"); String [] inclucelist = includeStrings.Split (";"); if (! this.iscontains (hrequest.getRequesturi (), inklusiveList)) {// Filter nur die angegebene Filterparameter -Suffix -Kette.Dofilter (Request, Antwort); zurückkehren; } if (this.iscontains (hrequest.getRequesturi (), logonList)) {// filtern Sie die Anmeldeseitenkette nicht filtern. zurückkehren; } String user = (string) hrequest.getSession (). GetAtTribute ("useronly"); // Beurteilen Sie, ob der Benutzer angemeldet ist, wenn (user == null) {Wraper.sendRect (redirectPath); zurückkehren; } else {chain.dofilter (Anfrage, Antwort); zurückkehren; }} public void init (filterConfig filterconfig) löst ServletException aus {config = filterConfig; }}Auf diese Weise können alle Anfragen an den Benutzer abgeschlossen werden, und die Benutzeranmeldung muss über diesen Filter überprüft werden.
Verhindern Sie chinesische verstümmelte Filter
Wenn das Projekt das Spring Framework verwendet. Wenn auf der aktuellen JSP -Seite und dem Java -Code für die Codierung verschiedene Zeichensätze verwendet werden, werden Probleme mit dem Formular übermittelten Daten oder dem Hochladen/Herunterladen von chinesischen Namensdateien aufgebaut. Dann können Sie diesen Filter verwenden.
<Filter> <filter-name> codieren </filter-name> <filterklasse> org.springFramework.web.filter.CharactercodingFilter </filterklasse> <init-param> <param-name> codieren </param-name> <! ---- </init-param> <init-param> <param-name> forceCoding </param-name> <!-true: Unabhängig davon, ob die Anforderung eine Zeichensatz festgelegt hat, wird eine Codierung verwendet. Falsch: Wenn die Anforderung einen Zeichensatz angegeben hat, wird die Codierung nicht verwendet-> <param-value> false </param-value> </init-param> </filter> <filter-mapping> <filter-name> codierung </filter-name> <url-pattern>/*</url-patter> </filter-mapping>
OpenSessionInviewfilter von Frühling+Hibernate steuert den Sitzungsschalter
Wenn Hibernate+Spring in Verbindung damit verwendet wird, wird der Hibernate beim Lesen der Daten beim Lesen der Daten die Sitzung automatisch nach dem Lesen der übergeordneten Daten automatisch schließen, wenn Lazy = True festgelegt wird. Auf diese Weise wirft das System auf diese Weise einen LazyInit -Fehler. Zu diesem Zeitpunkt müssen Sie den OpenSessionInviewfilter -Filter verwenden, der von Feder bereitgestellt wird.
OpenSessionInviewFilter führt den Sitzungsstatus hauptsächlich bei, bis die Anforderung alle Seiten an den Client sendet, und schließt die Sitzung erst nach Abschluss der Anfrage, um die durch faulen Laden verursachten Probleme zu lösen.
HINWEIS: Die OpenSessionInviewfilter -Konfiguration sollte vor der Konfiguration von Struts2 geschrieben werden. Da der Tomcat -Container beim Laden des Filters nacheinander geladen wird, wenn die Konfigurationsdatei zuerst die Filterkonfiguration von Struts2 schreibt und dann die OpenSessionInviewfilter -Filter -Konfiguration führt, führt die Ladereihenfolge in der Sitzung, die beim Erhalten von Daten nicht nach Feder verwaltet wird.
<filter><!-- lazy loading enabled in spring --> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>sessionFactoryBeanName</param-name><!-- Default. Standardmäßig ist die Bean mit ID als SessionFactory aus dem Federcontainer. Wenn die ID nicht SessionFactory ist, müssen Sie sie wie folgt konfigurieren. Hier ist die Sitzung der Bohne im Federbehälter. --> <param-value>sessionFactory</param-value> </init-param> <init-param> <param-name>singleSession</param-name><!-- singleSession defaults to true, if set to false, it is equal to no use OpenSessionInView --> <param-value>true</param-value> </init-param></filter><filter-mapping> <Filter-name> openSessionInviewFilter </filter-name> <URL-Muster>*. Do </url-pattern> </filter-mapping>
Die web.xml -Konfiguration von Struts2
Um Struts2 im Projekt zu verwenden, müssen Sie auch einen Filter in Web.xml konfigurieren, um Anforderungen abzufangen, und zur Verarbeitung von Struts2 gehen.
HINWEIS: Wenn in der Struts2 -Version vor 2.1.3 der Filter org.apache.struts2.dispatcher.filterDispatcher verwendet. Andernfalls verwenden Sie org.apache.struts2.dispatcher.ng.filter.strutsprepareAndexecuteFilter. Beginnend mit Struts 2.1.3 wird der ActionContextCleanUp -Filter aufgegeben, während die entsprechende Funktionalität im StrutspreeteAndexecuteFilter -Filter enthalten ist.
Drei Initialisierungsparameter werden konfiguriert:
<!-- struts 2.x filter --><filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts2</filter-name> <URL-Muster>*. Do </url-pattern> </filtermapping>
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!