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

Kurzgefasst: Filter in Java

Filter-Beschreibung

Filter wird auch als Filter bezeichnet und ist eine der praktischsten Technologien in der Servlet-Technologie. Webentwickler verwenden die Filter-Technologie, um alle von dem Webserver verwalteten Webressourcen zu blockieren: z.B. Jsp, Servlet, statische Bilddateien oder statische html-Dateien, um einige spezielle Funktionen zu realisieren. Zum Beispiel die Realisierung von URL-Ebene der Berechtigungssteuerung, das Filtern sensibler Wörter, das Komprimieren der Antwortinformationen und andere fortgeschrittene Funktionen.

Es wird hauptsächlich zur Vorverarbeitung der Benutzeranfragen verwendet und kann auch die Nachverarbeitung der HttpServletResponse durchführen. Der vollständige Workflow des Filters: Der Filter führt die Vorverarbeitung der Benutzeranfragen durch, gibt die Anfrage dann an den Servlet weiter, um die Antwort zu generieren, und führt schließlich die Nachverarbeitung der Serverantwort durch.

Filter-Funktion

Interceptiert man den HttpServletRequest, bevor dieser den Servlet erreicht. Man kann den HttpServletRequest überprüfen und auch die Header und Daten des HttpServletRequest ändern.

Interceptiert man die HttpServletResponse, bevor diese dem Client erreicht. Man kann die HttpServletResponse überprüfen und auch die Header und Daten der HttpServletResponse ändern.

Wie man mit Filtern eine Blockierungsfunktion implementiert

Im Filter-Interface gibt es eine Methode doFilter. Wenn Entwickler den Filter fertiggestellt haben und festgelegt haben, welche Webressource blockiert werden soll, ruft der Webserver vor jedem Aufruf der Service-Methode der Webressource zunächst die Methode doFilter des Filters auf. Daher kann man durch die Code-Aufrufe in dieser Methode folgende Ziele erreichen:

Vor dem Aufruf der Zielressource wird ein Abschnitt von Code ausgeführt.

Ob das Zielressource aufgerufen wird (d.h. ob der Benutzer die Webressource aufgerufen wird).

Der Webserver übermittelt bei der Aufrufung der Methode doFilter einen FilterChain-Objekt, das einer der wichtigsten Objekte im Filter-Interface ist. Es stellt ebenfalls eine Methode doFilter bereit, die Entwickler je nach Bedarf aufrufen können. Ruft man diese Methode auf, ruft der Webserver die Service-Methode der Webressource auf, d.h. die Webressource wird aufgerufen, andernfalls wird die Webressource nicht aufgerufen.

Filter-Entwicklung in zwei Schritten

Schreiben Sie eine Java-Klasse, die das Interface Filter implementiert und die doFilter-Methode implementiert.

 Die filternde Klasse wird im web.xml-Datei registriert und die Ressourcen, die sie abfangen kann, werden eingerichtet.

Einführung in die Knoten der web.xml-Konfiguration:

  • <filter> definiert einen Filter.
  • <filter-name> wird verwendet, um einem Filter einen Namen zuzuweisen. Der Inhalt dieses Elements darf nicht leer sein.
  • <filter-class> wird verwendet, um den vollständigen限定类namen des Filters zu spezifizieren.
  • <init-param> wird verwendet, um Initialisierungsparameter für den Filter zu spezifizieren. Sein Kind-Element <param-name> definiert den Namen des Parameters, <param-value> definiert den Wert des Parameters.
  • Im Filter kann das Interface FilterConfig verwendet werden, um Initialisierungsparameter abzurufen.
  • <filter-mapping> wird verwendet, um eine von einem Filter verantwortete Ressource zu konfigurieren. Eine von einem Filter abgefangene Ressource kann auf zwei Weisen angegeben werden: Servlet-Name und Anfragepfad
  • <filter-name> wird verwendet, um den Namen des Filters zu konfigurieren. Dieser Wert muss der Name eines Filters sein, der im <filter>-Element deklariert wurde
  • <url-pattern> setzt den Pfad der Anfragen, die der Filter abfangen soll (URL-Stil, der mit dem Filter verbunden ist)
  • <servlet-name> definiert den Namen des Servlets, das vom Filter abgefangen wird.
  • <dispatcher> definiert 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 einstellen, um verschiedene Aufrufweisen für die Filter-Ressourcen zu bestimmen.
  • Werte und Bedeutung der <dispatcher>-Elemente, die eingestellt werden können
  • REQUEST:Wenn der Benutzer die Seite direkt aufruft, ruft der Web-Container den Filter auf. Wenn der Zielressource über die Methoden include() oder forward() des RequestDispatcher zugegriffen wird, wird der Filter nicht aufgerufen.
  • INCLUDE:Wenn der Zielressource über die Methode include() des RequestDispatcher zugegriffen wird, wird der Filter aufgerufen. Ansonsten wird der Filter nicht aufgerufen.
  • FORWARD: Wenn das Zielressource durch das forward()-Method des RequestDispatcher erreicht wird, wird dieser Filter aufgerufen, außer diesem wird der Filter nicht aufgerufen.
  • ERROR: Wenn das Zielressource durch das Mechanismus der deklarativen Ausnahmebehandlung aufgerufen wird, wird dieser Filter aufgerufen. Daneben wird der Filter nicht aufgerufen.

Filterkette

In einer Web-Anwendung kann man mehrere Filter entwickeln, diese Filter werden zusammen zu einer Filterkette kombiniert.

Der Web-Server entscheidet gemäß der Reihenfolge der Registrierung des Filters in der web.xml-Datei, welche Filter zuerst aufgerufen werden. Wenn die doFilter-Methode des ersten Filters aufgerufen wird, erstellt der Web-Server ein FilterChain-Objekt, das an die Methode weitergegeben wird. Wenn Entwickler in der doFilter-Methode die doFilter-Methode des FilterChain-Objekts aufrufen, überprüft der Web-Server, ob es im FilterChain-Objekt noch Filter gibt. Gibt es welche, so wird der nächste Filter aufgerufen.2einen Filter, falls nicht, wird auf die Zielressource zurückgegriffen.

Lebenszyklus des Filters

public void init(FilterConfig filterConfig) throws ServletException;//Initialisierung

Wie unser eigenes Servlet-Programm, wird die Erstellung und Zerstörung des Filters von der WEB-Server verwaltet. Beim Start der Web-Anwendung erstellt der Web-Server eine Instanz des Filters und ruft dessen init-Methode auf, liest die Konfiguration aus web.xml aus und führt die Initialisierungsfunktion des Objekts durch, um die Vorbereitung für die zukünftigen Benutzeranfragen zu ermöglichen (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-Konfigurationsinformationen darstellt.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//Abfangen von Anfragen

Diese Methode führt die tatsächliche Filterung durch. Wenn der Kunde den 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();//Zerstören

Das Filter-Objekt bleibt nach der Erstellung im Speicher, wird erst zerstört, wenn die Web-Anwendung entfernt oder der Server gestoppt wird. Diese Methode wird vor dem Entladen des Filter-Objekts aus dem Web-Container aufgerufen. Diese Methode wird im Lebenszyklus des Filters nur einmal ausgeführt. In dieser Methode können Ressourcen, die vom Filter verwendet werden, freigegeben werden.

FilterConfig-Schnittstelle

Wenn der Benutzer den Filter konfiguriert, kann er einige Initialisierungsparameter für den Filter konfigurieren. Wenn der Web-Container das Filter-Objekt instantiiert und die init-Methode aufruft, wird das filterConfig-Objekt, das die Initialisierungsparameter des Filters enthält, übergeben. Daher können Entwickler, indem sie die Methoden des filterConfig-Objekts verwenden, die folgenden Inhalte erhalten:

String getFilterName();//Erhält den Namen des Filters. 
String getInitParameter(String name);//Gibt den Wert des Initialisierungsparameters mit dem angegebenen Namen zurück. Wenn dieser nicht existiert, wird null zurückgegeben. 
Enumeration getInitParameterNames();//Gibt die Sammlung der Namen der gesamten Initialisierungsparameter des Filters zurück. 
public ServletContext getServletContext();//Gibt den Verweis auf das Servlet-Context-Objekt zurück.

Beispiel für Filter

Filter zur Überprüfung der Benutzeranmeldung und zur Sicherheitskontrolle verwenden

Vor kurzem habe ich an einem Projekt mitgewirkt, nach dem der Benutzer das System verlassen hat und dann die Adresse im Adressfeld aufgerufen hat, basierend auf der URL, konnte der Benutzer immer noch in die Antwortseite des Systems eintreten. Ich habe überprüft und festgestellt, dass die Anfragen nicht überprüft wurden, ob der Benutzer angemeldet ist. Mit einem Filter wurde das Problem gelöst!

Zunächst im web.xml konfigurieren

<filter>
  <filter-name>SessionFilter</filter-name>
  <filter-class>com.action.login.SessionFilter</filter-class>
  <init-param>
    <param-name>logonStrings</param-name><!-- Filtern Sie die Login-Seite nicht -->
    <param-value>/project/index.jsp;login.do</param-value>
  </init-param>
  <init-param>
    <param-name>includeStrings</param-name><!-- Filtern Sie nur die angegebenen Filterparameter-Endungen -->
    <param-value>.do;.jsp</param-value>
  </init-param>
  <init-param>
    <param-name>redirectPath</param-name><!-- Nicht genehmigt, um zur Login-Oberfläche zu springen -->
    <param-value>/index.jsp</param-value>
  </init-param>
  <init-param>
    <param-name>disabletestfilter</param-name><!-- Y: Filterung ungültig -->
    <param-value>N</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>SessionFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Dann wird FilterServlet geschrieben

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;
/**
 *  Überprüfen Sie, ob der Benutzer angemeldet ist, und verlassen Sie das System, wenn er nicht angemeldet ist
 */
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");    // Login-Seite anmelden
    String includeStrings = config.getInitParameter("includeStrings");  // Filtern Sie die Ressourcenaufsatze
    String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// Keine Anmeldung, um zur Umleitungsseite zu wechseln
    String disabletestfilter = config.getInitParameter("disabletestfilter");// Ist der Filter aktiv?
    if (disabletestfilter.toUpperCase().equals("Y")) {  // Filterung ist ungültig
      chain.doFilter(request, response);
      return;
    }
    String[] logonList = logonStrings.split(";");
    String[] includeList = includeStrings.split(";");
    if (!this.isContains(hrequest.getRequestURI(), includeList)) {// Filtern Sie nur die angegebenen Filterparameter-Endungen
      chain.doFilter(request, response);
      return;
    }
    if (this.isContains(hrequest.getRequestURI(), logonList)) {// Filtern Sie die Login-Seite nicht
      chain.doFilter(request, response);
      return;
    }
    String user = (String) hrequest.getSession().getAttribute("useronly");//Überprüfen Sie, ob der Benutzer angemeldet ist
    if (user == null) {
      wrapper.sendRedirect(redirectPath);
      return;
    } else {
      chain.doFilter(request, response);
      return;
    }
  }
  public void init(FilterConfig filterConfig) throws ServletException {
    config = filterConfig;
  }
}

So dass alle Anfragen des Benutzers validiert werden müssen, die durch diesen Filter überprüft werden, um die Anmeldung des Benutzers zu authentifizieren.

防止中文乱码过滤器

项目使用spring框架时。当前台JSP页面和Java代码中使用了不同的字符集进行编码时,就会出现表单提交的数据或者上传/下载中文名称文件出现乱码问题时,就可以使用这个过滤器。

<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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

声明:本文内容来自网络,版权属于原作者。内容由互联网用户自发贡献并自行上传,本网站不拥有所有权,未进行人工编辑处理,也不承担相关法律责任。如果您发现涉嫌版权的内容,请发送邮件至:notice#oldtoolbag.com(在发送邮件时,请将#更换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。)

Gefällt mir