Heim  >  Artikel  >  Java  >  Ausführliche Erklärung des Filters in Java

Ausführliche Erklärung des Filters in Java

高洛峰
高洛峰Original
2017-02-08 11:41:051602Durchsuche

Filter-Einführung

Filter wird auch Filter genannt. Es ist die praktischste Technologie in der Servlet-Technologie, die die Filtertechnologie verwendet, um alle vom Webserver verwalteten Webressourcen zu verwalten: wie Jsp, Servlet, Intercept statische Bilddateien oder statische HTML-Dateien, um einige spezielle Funktionen zu erreichen. Beispielsweise können einige erweiterte Funktionen wie die Berechtigungszugriffskontrolle auf URL-Ebene, die Filterung vertraulicher Vokabeln und die Komprimierung von Antwortinformationen implementiert werden.

Es wird hauptsächlich zur Vorverarbeitung von Benutzeranfragen verwendet und kann auch HttpServletResponse nachbearbeiten. Der vollständige Prozess der Verwendung von Filter: Filter verarbeitet die Benutzeranforderung vor, übergibt die Anforderung dann zur Verarbeitung an Servlet und generiert eine Antwort, und schließlich verarbeitet Filter die Serverantwort nach.

Filterfunktion

Fängt die HttpServletRequest des Clients ab, bevor sie das Servlet erreicht. Überprüfen Sie HttpServletRequest nach Bedarf und ändern Sie den Header und die Daten von HttpServletRequest.

HttpServletResponse abfangen, bevor sie den Client erreicht. Überprüfen Sie HttpServletResponse nach Bedarf und ändern Sie den Header und die Daten von HttpServletResponse.

So implementieren Sie die Abfangfunktion mit Hilfe von Filter

Es gibt eine doFilter-Methode in der Filterschnittstelle. Wenn der Entwickler den Filter schreibt und konfiguriert, welche Webressource abgefangen werden soll, wird der WEB-Server verwendet Ruft jedes Mal die Webressource auf, bevor die Methode doFilter des Filters aufgerufen wird. Daher kann das Schreiben von Code in dieser Methode die folgenden Zwecke erreichen:

Lassen Sie ein Stück des Codes wird ausgeführt, bevor die Zielressource aufgerufen wird.

Gibt an, ob die Zielressource aufgerufen werden soll (d. h. ob dem Benutzer der Zugriff auf Webressourcen gestattet werden soll).

Wenn der Webserver die doFilter-Methode aufruft, übergibt er ein filterChain-Objekt. Es stellt auch eine doFilter-Methode bereit Wenn diese Methode aufgerufen wird, ruft der Webserver je nach Bedarf die Dienstmethode der Webressource auf, dh auf die Webressource wird zugegriffen, andernfalls wird nicht auf die Webressource zugegriffen.

Zwei Schritte für die Filterentwicklung

Schreiben Sie eine Java-Klasse, um die Filter-Schnittstelle und ihre doFilter-Methode zu implementieren.

Verwenden Sie und-Elemente in der Datei web.xml, um die geschriebene Filterklasse zu registrieren und die Ressourcen festzulegen, die sie abfangen kann.

Einführung in den Web.xml-Konfigurationsknoten:

Geben Sie einen Filter an.

wird verwendet, um einen Namen für den Filter anzugeben. Der Inhalt dieses Elements darf nicht leer sein. Das Element

wird verwendet, um den vollständig qualifizierten Klassennamen des Filters anzugeben. Das

-Element wird verwendet, um Initialisierungsparameter für den Filter anzugeben. Sein Unterelement gibt den Namen des Parameters an Wert des Parameters.

In einem Filter können Sie das FilterConfig-Schnittstellenobjekt verwenden, um auf Initialisierungsparameter zuzugreifen. Das

-Element wird verwendet, um die Ressourcen festzulegen, für deren Abfangen ein Filter verantwortlich ist. Die von einem Filter abgefangenen Ressourcen können auf zwei Arten angegeben werden: Servlet-Name und Anforderungspfad für den Ressourcenzugriff. Das Unterelement

Dieser Wert muss der Name des im -Elements deklarierten Filters sein.

🎜 >Gibt den Namen des vom Filter abgefangenen Servlets an.

Gibt an, wie die vom Filter abgefangenen Ressourcen vom Servlet-Container aufgerufen werden. Dies kann REQUEST, INCLUDE, FORWARD und ERROR sein. Benutzer können mehrere -Unterelemente festlegen, um einen Filter anzugeben, der mehrere Aufrufmethoden von Ressourcen abfängt.

Die Werte, die Unterelemente festlegen können, und ihre Bedeutung

ANFRAGE: Wenn der Benutzer direkt auf die Seite zugreift, ruft der Webcontainer den Filter auf. Wenn über die Methode include() oder forward() des RequestDispatcher auf die Zielressource zugegriffen wird, wird dieser Filter nicht aufgerufen.

INCLUDE: Wenn über die include()-Methode von RequestDispatcher auf die Zielressource zugegriffen wird, wird dieser Filter aufgerufen. Andernfalls wird der Filter nicht aufgerufen.

FORWARD: Wenn auf die Zielressource über die Methode „forward()“ von RequestDispatcher zugegriffen wird, wird dieser Filter aufgerufen.

FEHLER: Wenn die Zielressource über den deklarativen Ausnahmebehandlungsmechanismus aufgerufen wird, wird dieser Filter aufgerufen. Andernfalls wird der Filter nicht aufgerufen.

Filterkette

In einer Webanwendung können mehrere Filter entwickelt und geschrieben werden. Die Kombination dieser Filter wird als Filterkette bezeichnet.

Der Webserver bestimmt, welcher Filter zuerst aufgerufen werden soll, basierend auf der Registrierungsreihenfolge des Filters in der web.xml-Datei. Wenn die doFilter-Methode des ersten Filters aufgerufen wird, erstellt der Webserver ein FilterChain-Objekt, das Folgendes darstellt die Filterkette und übergeben Sie sie. Geben Sie die Methode an. Wenn der Entwickler in der doFilter-Methode die doFilter-Methode des FilterChain-Objekts aufruft, prüft der Webserver, ob ein anderer Filter im FilterChain-Objekt vorhanden ist. Wenn nicht, wird die Zielressource aufgerufen aufgerufen werden.

Filterlebenszyklus

public void init(FilterConfig filterConfig) throws ServletException;//初始化

Ähnlich wie bei dem von uns geschriebenen Servlet-Programm liegt die Erstellung und Zerstörung von Filter in der Verantwortung des WEB-Servers. Wenn die Webanwendung gestartet wird, erstellt der Webserver ein Instanzobjekt von Filter, ruft seine Init-Methode auf, liest die web.xml-Konfiguration und schließt die Initialisierungsfunktion des Objekts ab, wodurch er sich auf das Abfangen nachfolgender Benutzeranforderungen vorbereitet (das Filterobjekt). wird nur einmal erstellt und die Init-Methode wird nur einmal ausgeführt. Entwickler können das FilterConfig-Objekt, das die aktuellen Filterkonfigurationsinformationen darstellt, über die Parameter der Init-Methode abrufen.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//拦截请求

Diese Methode schließt den eigentlichen Filtervorgang ab. Wenn der Client Zugriff auf die mit dem Filter verknüpfte URL anfordert, führt der Servlet-Filter zunächst die doFilter-Methode aus. Der FilterChain-Parameter wird verwendet, um auf nachfolgende Filter zuzugreifen.

public void destroy();//销毁

Filterobjekte verbleiben nach der Erstellung im Speicher und werden zerstört, wenn die Webanwendung entfernt oder der Server gestoppt wird. Wird aufgerufen, bevor der Webcontainer das Filterobjekt entlädt. Diese Methode wird nur einmal im Lebenszyklus des Filters ausgeführt. Bei dieser Methode können vom Filter genutzte Ressourcen freigegeben werden.

FilterConfig-Schnittstelle

Beim Konfigurieren des Filters kann der Benutzer einige Initialisierungsparameter für den Filter konfigurieren. Wenn der Webcontainer das Filterobjekt instanziiert und seine Init-Methode aufruft, wird die Filterinitialisierung gekapselt Parameter. Das filterConfig-Objekt wird übergeben. Wenn Entwickler daher Filter schreiben, können sie über die Methode des filterConfig-Objekts den folgenden Inhalt erhalten:

String getFilterName();//得到filter的名称。 String getInitParameter(String name);//返回在部署描述中指定名称的初始化参数的值。如果不存在返回null. Enumeration getInitParameterNames();//返回过滤器的所有初始化参数的名字的枚举集合。 public ServletContext getServletContext();//返回Servlet上下文对象的引用。

Filter-Anwendungsfall

Verwenden Sie Filter, um die Sicherheitskontrolle für die Benutzeranmeldung zu überprüfen

Ich habe vor einiger Zeit an der Wartung eines Projekts teilgenommen. Nachdem der Benutzer das System verlassen hat, geht er zur Adressleiste, um auf den Verlauf zuzugreifen. Laut URL kann er weiterhin die Systemantwortseite aufrufen. Ich habe nachgesehen und festgestellt, dass die Anfrage nicht gefiltert wurde, um die Benutzeranmeldung zu überprüfen. Fügen Sie einen Filter hinzu, um das Problem zu lösen!

Konfigurieren Sie zuerst

<filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.action.login.SessionFilter</filter-class>
    <init-param>
        <param-name>logonStrings</param-name><!-- 对登录页面不进行过滤 -->
        <param-value>/project/index.jsp;login.do</param-value>
    </init-param>
    <init-param>
        <param-name>includeStrings</param-name><!-- 只对指定过滤参数后缀进行过滤 -->
        <param-value>.do;.jsp</param-value>
    </init-param>
    <init-param>
        <param-name>redirectPath</param-name><!-- 未通过跳转到登录界面 -->
        <param-value>/index.jsp</param-value>
    </init-param>
    <init-param>
        <param-name>disabletestfilter</param-name><!-- Y:过滤无效 -->
        <param-value>N</param-value>
    </init-param></filter><filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern></filter-mapping>

in web.xml und 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;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;/**
 *    判断用户是否登录,未登录则退出系统
 */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");        // 登录登陆页面
        String includeStrings = config.getInitParameter("includeStrings");    // 过滤资源后缀参数
        String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// 没有登陆转向页面
        String disabletestfilter = config.getInitParameter("disabletestfilter");// 过滤器是否有效

        if (disabletestfilter.toUpperCase().equals("Y")) {    // 过滤无效
            chain.doFilter(request, response);            return;
        }
        String[] logonList = logonStrings.split(";");
        String[] includeList = includeStrings.split(";");        if (!this.isContains(hrequest.getRequestURI(), includeList)) {// 只对指定过滤参数后缀进行过滤
            chain.doFilter(request, response);            return;
        }        if (this.isContains(hrequest.getRequestURI(), logonList)) {// 对登录页面不进行过滤
            chain.doFilter(request, response);            return;
        }

        String user = ( String ) hrequest.getSession().getAttribute("useronly");//判断用户是否登录
        if (user == null) {
            wrapper.sendRedirect(redirectPath);            return;
        }else {
            chain.doFilter(request, response);            return;
        }
    }    public void init(FilterConfig filterConfig) throws ServletException {
        config = filterConfig;
    }
}

Auf diese Weise müssen alle Anfragen an den Benutzer diesen durchlaufen Filter Benutzeranmeldung überprüfen.

Filter, um verstümmelte chinesische Zeichen zu verhindern

Wenn das Projekt das Spring-Framework verwendet. Wenn unterschiedliche Zeichensätze für die Codierung in der Front-End-JSP-Seite und im JAVA-Code verwendet werden, werden die vom Formular übermittelten Daten oder die hochgeladene/heruntergeladene chinesische Namensdatei verstümmelt, sodass Sie diesen Filter verwenden können.

<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name><!--用来指定一个具体的字符集-->
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name><!--true:无论request是否指定了字符集,都是用encoding;false:如果request已指定一个字符集,则不使用encoding-->
        <param-value>false</param-value>
    </init-param></filter><filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern></filter-mapping>

OpenSessionInViewFilter von Spring+Hibernate steuert den Sitzungswechsel

Wenn Hibernate+Spring zusammen verwendet wird, wenn lazy=true (verzögertes Laden) festgelegt ist, dann beim Lesen von Daten Wenn das übergeordnete Element Wenn die Daten gelesen werden, wird die Sitzung im Ruhezustand automatisch geschlossen. Wenn die damit verbundenen Daten und die untergeordneten Daten verwendet werden sollen, gibt das System einen Lazyinit-Fehler aus. In diesem Fall müssen Sie den bereitgestellten OpenSessionInViewFilter verwenden bis zum Frühjahr.

OpenSessionInViewFilter behält hauptsächlich den Sitzungsstatus bei, bis die Anforderung alle Seiten an den Client sendet, und schließt die Sitzung erst, wenn die Anforderung abgeschlossen ist, wodurch die durch verzögertes Laden verursachten Probleme gelöst werden.

Hinweis: Die OpenSessionInViewFilter-Konfiguration sollte vor der Struts2-Konfiguration geschrieben werden. Da der Tomcat-Container die Filter der Reihe nach lädt und dann die Filterkonfiguration „OpenSessionInViewFilter“ schreibt, führt die Ladereihenfolge dazu, dass die Sitzung getrennt wird, wenn die Aktion die Daten abruft.

<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><!-- 可缺省。默认是从spring容器中找id为sessionFactory的bean,如果id不为sessionFactory,则需要配置如下,此处SessionFactory为spring容器中的bean。 -->
        <param-value>sessionFactory</param-value>
    </init-param>
    <init-param>
        <param-name>singleSession</param-name><!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
        <param-value>true</param-value>
    </init-param></filter><filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>*.do</url-pattern></filter-mapping>

Struts2 web.xml-Konfiguration

Die Verwendung von Struts2 im Projekt erfordert auch die Konfiguration von Filtern in web.xml, um Anfragen abzufangen und sie zur Verarbeitung an Struts2 Action zu übertragen.

Hinweis: Wenn die Struts2-Version vor 2.1.3 ist, verwendet der Filter org.apache.struts2.dispatcher.FilterDispatcher. Andernfalls verwenden Sie org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter. Ab Struts2.1.3 wird der ActionContextCleanUp-Filter aufgegeben und die entsprechende Funktionalität wird in den StrutsPrepareAndExecuteFilter-Filter aufgenommen.

Drei Initialisierungsparameterkonfigurationen:

Konfigurationsparameter: Geben Sie die zu ladende Konfigurationsdatei an. Komma getrennt.

actionPackages-Parameter: Geben Sie den Paketbereich an, in dem sich die Action-Klasse befindet. Komma getrennt.

configProviders-Parameter: Benutzerdefinierter Konfigurationsdateianbieter, der die ConfigurationProvider-Schnittstellenklasse implementieren muss. Komma getrennt.

<!-- 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-pattern>*.do</url-pattern></filter-mapping>

Ausführlichere Erklärungen zum Filter in Java und verwandte Artikel finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn