Heim  >  Artikel  >  Java  >  Detaillierte Einführung in Filter in JavaWeb

Detaillierte Einführung in Filter in JavaWeb

黄舟
黄舟Original
2017-03-16 10:14:141478Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung des JavaWeb-FiltersFilter vor und analysiert die Verwendungsfähigkeiten des JavaWeb-Filters anhand von Beispielen. Er ist von großem praktischem Wert und Freunde in Not können sich darauf beziehen.

Ursprünglich wollte ich mit diesem Artikel JSP zusammenfassen. Da JSP viel Inhalt hat und ich nachts laufen möchte, um Gewicht zu verlieren, werde ich heute Filter und seine Anwendungsbeispiele vorstellen. Auf diese Weise bleibt noch etwas Zeit zum Trainieren. Näher an der Heimat hat der Filter buchstäblich die Funktion des Blockierens und Filterns. Er kann als Blockierungsassistent von JavaWeb angesehen werden.

1. Origin

Der Client initiiert eine Anfrage, sodass der Server nicht auf alle Anfragen reagieren kann, was nicht nur die Arbeitsbelastung reduzieren kann des Servers Es kann auch die Sicherheit der Daten schützen. Wenn der Server auf den Client antwortet, müssen diese manchmal gefiltert werden, beispielsweise durch das Hinzufügen von Wasserzeichen bei unseren üblichen Bildern. Um diese Probleme zu lösen, wurden Filter eingeführt. Manchmal gibt es nicht nur eine Filterebene für Anfragen und Antworten, sondern mehrere Filterebenen, daher wird das Konzept der Filterkette (FilterChain) vorgeschlagen.

2. Verwenden Sie

und machen Sie sich mit der Funktion vertraut, bevor Sie es verwenden. Der Filter durchläuft die Filterkette, bevor die Anfrage Servlet erreicht und bevor die Antwort den Browser erreicht. Etwas ähnlich wie httpmodule in asp.net Die Verwendung von Filter implementiert hauptsächlich die javax.servlet.filterSchnittstelle. Sehen Sie sich API an und Sie können sehen, dass es drei Methoden gibt.

1.public void init(FilterConfig filterConfig) throws ServletException

Wird vom Webcontainer aufgerufen, um den Filter anzugeben, in den eingefügt wird der Dienst. Der Servlet-Container ruft die Init-Methode nur einmal auf, nachdem er den Filter instanziiert hat. Die Init-Methode muss erfolgreich abgeschlossen werden, bevor der Filter aufgefordert wird, Filterarbeiten durchzuführen. Wenn die Init-Methode eine ServletException auslöst oder nicht innerhalb des vom Webcontainer definierten Zeitraums zurückkehrt, kann der Webcontainer den Filter nicht in den Dienst einfügen. Dies ähnelt in gewisser Weise dem Lebenszyklus des Servlets. Es wird nur einmal initialisiert und destroy() wird auch einmal ausgeführt.

2. public void doFilter(ServletRequest request, ServletResponse Response, FilterChain chain) löst java.io.IOException, ServletException aus

Jedes Mal aufgrund eines Paares am Ende der Kette Wenn eine Clientanforderung für eine Ressource ein Anforderungs-/Antwortpaar durch die Kette leitet, ruft der Container die doFilter-Methode des Filters auf. Die an diese Methode übergebene FilterChain ermöglicht es dem Filter, die Anfrage und Antwort an die nächste Entität in der Kette weiterzuleiten.
Eine typische Implementierung dieser Methode folgt dem folgenden Muster:

1. Überprüfen Sie die Anfrage

2. Übergeben Sie die Anfrage optional mit einer benutzerdefinierten Implementierung Objekt in Filterinhalt oder Header für die Eingabefilterung eingepackt

3. Antwortobjekt mit benutzerdefinierter Implementierung optional in Filterinhalt für die Ausgabefilterung einschließen Oder im Header

4. a) Sie können entweder das FilterChain-Objekt (chain.doFilter()) verwenden, um die nächste Entität in der Kette aufzurufen,

4) Es ist auch möglich, die Anforderungsverarbeitung zu blockieren, indem Sie nicht Übergabe des Anforderungs-/Antwortpaars an die nächste Entität in der Filterkette

5. Setzen Sie Header für die Antwort direkt nach dem Aufruf der nächsten Entität in der Filterkette.

3. public void destroy()

Wird vom Webcontainer aufgerufen, um den Filter anzugeben, der aus dem Dienst genommen werden soll. Diese Methode wird nur einmal aufgerufen, nachdem alle Threads in der doFilter-Methode des Filters beendet wurden oder nachdem die Zeitüberschreitungsperiode abgelaufen ist. Nach dem Aufruf dieser Methode ruft der Webcontainer die doFilter-Methode für diese Filterinstanz nicht auf. Diese Methode bietet dem Filter die Möglichkeit, alle darin enthaltenen Ressourcen (z. B. Speicher, Dateihandles und Threads) zu bereinigen und stellt sicher, dass jeder dauerhafte Status mit dem aktuellen Status des Filters synchronisiert bleibt Erinnerung.

3. Fälle

Es gibt viele Orte, an denen Filter verwendet werden können, daher werde ich hier keine Beispiele nennen vorheriger Blog Basierend auf dem HelloWorld-Projekt wurde die Anti-Leeching-Funktion implementiert, um die Verwendung von Filter zu erleben.

1. Vorbereitung

Fügen Sie im HelloWolrd-Projekt einen -Ordner hinzu und legen Sie zwei Bilder in den Ordner, ein err.png und ein test.png. Die beiden Bilder sind wie folgt

2. Filter erstellen

Es gibt hier kein neues Filterpaket im Paket com.test.cyw. Es sollte speziell ein Paket erstellt werden um Filter zu verwalten. Nun, das ist nur zum Testen. Nach der Erstellung können Sie sehen, dass MyFilter Filter erbt.


 public class MyFilter implements Filter

3. Anti-Hotlinking in doFilter implementieren


package com.test.cyw;

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.annotation.WebFilter;
import javax.servlet.http.*;

/*@WebFilter("/MyFilter")*/
public class MyFilter implements Filter {

  public MyFilter() {
    
  }

  public void destroy() {
    
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    HttpServletRequest req=(HttpServletRequest)request;
    HttpServletResponse res=(HttpServletResponse)response;
    String referer=req.getHeader("referer");//链接来源地址
    if(referer==null||!referer.contains(req.getServerName()))
    {
      req.getRequestDispatcher("/Images/err.png").forward(req, res);
      return;
    }
    chain.doFilter(req, res);
  }

  public void init(FilterConfig fConfig) throws ServletException {
    
  }
}

4.Filterkonfiguration

Das Obige erstellt lediglich eine Klasse, die die Filterschnittstelle implementiert. Dies ähnelt Servlet und muss in Web konfiguriert werden.xml. Es ist ein bisschen dasselbe wie das Konfigurieren eines Servlets.


  <filter>
   <filter-name>MyFilter</filter-name>
   <filter-class>com.test.cyw.MyFilter</filter-class>
 </filter>
 <filter-mapping>
   <filter-name>MyFilter</filter-name>
   <url-pattern>/Images/*</url-pattern>
 </filter-mapping>

5. Testen Sie eine neue test.jsp-Datei und zeigen Sie das Bild im JSP an.


 <%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<img alt="防盗链" src="Images/test.png" width="400">
</body>
</html>

Wenn Sie die Adresse von test.png direkt in den Browser eingeben, err.png

wird angezeigt

4. Es sind Probleme aufgetretenZu Beginn wurde aufgrund eines Adressfehlers das Bild in Google Chrome test.jsp angezeigt war auch das err.png-Bild, aber als ich umgeschaltet und die Seite aktualisiert habe, hat es mich immer noch nicht verändert. Manchmal funktioniert ein Neustart von Tomca nicht, und es funktioniert immer noch mehrmals. Wenn es wirklich nicht funktioniert, habe ich es mit dem IE versucht, aber ich habe nicht erwartet, dass die Anzeige korrekt war ein

Cache

, der zu einer fehlerhaften Anzeige führte.

5. ZusammenfassungFilter hat viele Verwendungsmöglichkeiten, und es gibt viele Beispiele im Internet, von denen Sie einige zuerst implementieren können häufig verwendete wie Wasserzeichen usw. Bei der Verwendung müssen Sie nur die XML-Datei konfigurieren, um das Problem zu lösen, was sehr praktisch ist.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Filter in JavaWeb. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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