English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSP-Filter

Filter in JSP und Servlet sind Java-Klassen.

Filter können dynamisch Anfragen und Antworten abfangen, um Informationen zu transformieren oder zu verwenden, die in der Anfrage oder Antwort enthalten sind.

Es können einen oder mehrere Filter an ein Servlet oder eine Gruppe von Servlets angehängt werden. Filter können auch an JavaServer Pages (JSP) -Dateien und HTML-Seiten angehängt werden.

Filter sind Java-Klassen für Servlet-Programmierung, die folgende Zwecke erfüllen können:

  • Blockieren Sie diese Anfragen, bevor sie auf die Backend-Ressourcen zugreifen.

  • Verarbeiten Sie diese Antworten, bevor sie an den Client gesendet werden.

Verschiedene Arten von Filtern gemäß den Empfehlungen der Normen:

  • Authentifizierungsfilter (Authentication Filters).

  • Datenkomprimierungsfilter (Data compression Filters).

  • Verschlüsselungsfilter (Encryption Filters).

  • Filter, die Ereignisse der Ressourcenabfrage auslösen.

  • Bilde Konvertierungsfilter (Image Conversion Filters).

  • Protokollierungs- und Überwachungsfilter (Logging and Auditing Filters).

  • MIME-TYPE Kette Filter (MIME-TYPE Chain Filters).

  • Markierungsfilters (Tokenizing Filters).

  • XSL/T Filter (XSL/T Filters), XML-Inhalte umwandeln.

Filter werden durch die XML-Tags im Web-Deployment-Description (web.xml) deklariert und dann auf den Servlet-Namen oder die URL-Muster in der Deployment-Description Ihres Anwendungsmaps gelinkt.

Wenn der Web-Container die Web-Anwendung startet, erstellt er für jeden Filter, den Sie in der Deployment-Description angegeben haben, ein Beispielobjekt.

Die Ausführungsreihenfolge der Filter stimmt mit der Konfigurationsreihenfolge in der web.xml-Konfigurationsdatei überein. Normalerweise wird der Filter vor allen Servlets konfiguriert.

Servlet Filter Methoden

Ein Filter ist eine Java-Klasse, die das Interface javax.servlet.Filter implementiert. Das javax.servlet.Filter-Interface definiert drei Methoden:

ReihennummerMethode & Beschreibung
1public void doFilter(ServletRequest, ServletResponse, FilterChain)
Diese Methode führt die tatsächliche Filterung durch. Wenn die Anfrage des Clients mit der URL des Filters übereinstimmt, ruft der Servlet-Container zunächst die doFilter-Methode des Filters auf. Der FilterChain wird verwendet, um auf nachfolgende Filter zuzugreifen.
2public void init(FilterConfig filterConfig)
Bei der Startphase einer Web-Anwendung erstellt der Web-Server ein Beispielobjekt für den Filter und ruft dessen init-Methode auf, um die Konfiguration in web.xml zu lesen und die Initialisierungsfunktion des Objekts abzuschließen. Dies bereitet die Interception-Vorbereitungen für nachfolgende Benutzeranfragen vor (der Filter-Objekt wird nur einmal erstellt und die init-Methode wird nur einmal ausgeführt). Entwickler können durch die Parameter der init-Methode das FilterConfig-Objekt erhalten, das die aktuelle Filter-Konfigurationsinformation repräsentiert.
3public void destroy()}
Servlet 容器在销毁过滤器示例之前调用该方法,在该方法中释放 Servlet 过滤器占用的资源。

FilterConfig 使用

Filter 的 init 方法提供了一个 FilterConfig 对象。

如 web.xml 文件配置如下:

<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.w3codebox.test.LogFilter</filter-class>
    <init-param>
        <param-name>Site</param-name>
        <param-value>Grundlagenwebsite</param-value>
    </init-param>
    </filter>

在 init 方法中使用 FilterConfig 对象获取参数:

public void init(FilterConfig config) throws ServletException {
    // 获取初始化参数
    String site = config.getInitParameter("Site"); 
    // 输出初始化参数
    System.out.println("网站名称: ")); + site); 
}

JSP 过滤器示例

以下是一个 Servlet 过滤器的示例,它将输出网站名称和地址。本示例使您对 Servlet 过滤器有一个基本的了解,您可以使用相同的概念编写更复杂的过滤器应用程序:

//导入必需的 java 库
import javax.servlet.*;
import java.util.*;
//实现 Filter 类
public class LogFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        // 获取初始化参数
        String site = config.getInitParameter("Site"); 
        // 输出初始化参数
        System.out.println("网站名称: ")); + site); 
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
        // 输出站点名称
        System.out.println("站点网址:http:");//de.oldtoolbag.com");
        // 将请求传回过滤链
        chain.doFilter(request,response);
    }
    public void destroy( ){
        /* 在 Filter 示例被 Web 容器从服务移除之前调用 */
    }
}

DisplayHeader.java 文件代码如下:

//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DisplayHeader")
//Erweiterung der HttpServlet-Klasse
public class DisplayHeader extends HttpServlet
    // Methode zum Verarbeiten von GET-Methoden-Anfragen
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // Setzen Sie den Inhaltstyp der Antwort
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "HTTP Header Anfragebeispiel - 基础教程网示例";
        String docType =
            "<!DOCTYPE html> \n";
            out.println(docType +
            "<html>\n" +
            "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
            "<tr bgcolor=\"#949494\">\n" +
            "<th>Header-Name</th><th>Header-Wert</th>\n"+
            "</tr>\n");
        Enumeration headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()) {}}
            String paramName = (String)headerNames.nextElement();
            out.print("<tr><td>" + paramName + "</td>\n");
            String paramValue = request.getHeader(paramName);
            out.println("<td> " + paramValue + "</td></tr>\n");
        }
        out.println("</table>\n</body></html>");
    }
    // Methode zum Verarbeiten von POST-Anfragenmethoden
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Servlet Filter Mapping in Web.xml

Definieren Sie den Filter und mappingen ihn auf eine URL oder Servlet, was dem Definieren eines Servlets und Mapping auf ein URL-Modell ähnlich ist. In der Deploymentspezifikationsdatei web.xml unter diesem Tag einen Eintrag für den Filter erstellen:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<filter>
  <filter-name>LogFilter</filter-name>
  <filter-class>com.w3codebox.test.LogFilter</filter-class>
  <init-param>
    <param-name>Site</param-name>
    <param-value>Grundlagenwebsite</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>LogFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>  
  <!-- Klassenname -->  
  <servlet-name>DisplayHeader</servlet-name>  
  <!-- im Paket befindlich -->  
  <servlet-class>com.w3codebox.test.DisplayHeader</servlet-class>  
</servlet>  
<servlet-mapping>  
  <servlet-name>DisplayHeader</servlet-name>  
  <!-- die besuchte Website -->  
  <url-pattern>/TomcatTest/DisplayHeader</url-pattern>  
</servlet-mapping>  
</web-app>

Dieser Filter ist für alle Servlets geeignet, da wir in der Konfiguration angegeben haben /* . Wenn Sie nur auf wenigen Servlets Filter anwenden möchten, können Sie einen bestimmten Servlet-Pfad angeben.

Versuchen Sie, jeden Servlet auf die gängigste Weise aufzurufen, und Sie werden das Protokoll sehen, das im Web-Server generiert wird. Sie können auch Log4Der Recorder wird verwendet, um die obigen Protokolle in eine separate Datei zu protokollieren.

Nun besuchen wir diese Beispiel-Adresse http://localhost:8080/TomcatTest/DisplayHeader, und dann überprüfen Sie die Ausgabe im Konsolenfenster

Verwendung mehrerer Filter

Eine Web-Anwendung kann mehrere verschiedene Filter für spezifische Zwecke definieren. Angenommen, Sie haben zwei Filter definiert AuthenFilter und LogFilter。Sie müssen einen anderen Mapping wie oben beschrieben erstellen, der Rest der Verarbeitung ist ähnlich wie oben gezeigt:

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>com.w3codebox.test.LogFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Parameter</param-value>
   </init-param>
</filter>
<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>com.w3codebox.test.AuthenFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Parameter</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Anwendungsorten der Filter

filter in web.xml-Die Reihenfolge des mapping-Elements bestimmt die Reihenfolge, in der der Web-Container den Filter auf den Servlet anwendet. Um die Reihenfolge der Filter umzukehren, müssen Sie nur die Reihenfolge der filter im web.xml-Datei umkehren-mapping-Element genügt.

Zum Beispiel wird im obigen Beispiel zuerst LogFilter und dann AuthenFilter angewendet, aber im folgenden Beispiel wird diese Reihenfolge umgekehrt:

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Beschreibung der Knoten in web.xml

  • <filter>Spezifiziert einen Filter.

    • <filter-name>Wird verwendet, um einem Filter einen Namen zu geben, der Inhalt dieses Elements darf nicht leer sein.

    • <filter-class>Element wird verwendet, um den vollständigen限定类名 des Filters zu spezifizieren.

    • <init-param>Element wird verwendet, um Initialisierungseigenschaften für den Filter zu spezifizieren, seine Unter-Elemente <param-name>Spezifiziert den Namen des Parameters, <param-value>Spezifiziert den Wert des Parameters.

    • In einem Filter kann das Interface-Objekt FilterConfig verwendet werden, um Initialisierungseigenschaften abzurufen.

  • <filter-mapping>Element wird verwendet, um die Ressourcen zu setzen, die ein Filter verantwortlich für die Interception sind. Eine von einem Filter abgefangene Ressource kann auf zwei Weisen angegeben werden: Servlet-Name und Anfragspfad der Ressourcenzugriff

    • <filter-name>Der Name des Elements zur Festlegung des Namens der Filter-Registrierung. Dieser Wert muss der Name eines Filters sein, der im Element <filter> deklariert wurde.

    • <url-pattern>stellt den Pfad der Anfragen ein, die vom Filter abgefangen werden (URL-Stil, der mit dem Filter verknüpft ist)

  • <servlet-name>spezifiziert den Namen des Servlets, das vom Filter abgefangen wird.

  • Das <dispatcher>-Element spezifiziert die Art und Weise, wie der Servlet-Container die vom Filter abgefangenen Ressourcen aufruft, und kann einer von REQUEST, INCLUDE, FORWARD und ERROR sein, Standard ist REQUEST. Benutzer können mehrere <dispatcher>-Elemente einrichten, um verschiedene Arten der Filter-Interception für Ressourcen zu spezifizieren.

  • Werte und Bedeutungen der <dispatcher>-Elemente, die festgelegt werden können

    • REQUEST: Wenn der Benutzer direkt auf die Seite zugreift, wird der Web-Container den Filter aufrufen. Wenn das Zielressource durch die Methode include() oder forward() des RequestDispatcher aufgerufen wird, wird der Filter nicht aufgerufen.

    • INCLUDE: Wenn das Zielressource durch die Methode include() des RequestDispatcher aufgerufen wird, wird dieser Filter aufgerufen. Abgesehen davon wird der Filter nicht aufgerufen.

    • FORWARD: Wenn das Zielressource durch die Methode forward() des RequestDispatcher aufgerufen wird, wird dieser Filter aufgerufen. Abgesehen davon wird der Filter nicht aufgerufen.

    • ERROR: Wenn das Zielressource durch das Mechanismus der deklarativen Ausnahmebehandlung aufgerufen wird, wird dieser Filter aufgerufen. Abgesehen davon wird der Filter nicht aufgerufen.