Servlets - Filter schreiben

Servlet-Filter sind Java-Klassen, die in der Servlet-Programmierung für die folgenden Zwecke verwendet werden können:

  • Abfangen von Anforderungen von einem Client, bevor dieser auf eine Ressource im Back-End zugreift.

  • So bearbeiten Sie Antworten vom Server, bevor sie an den Client zurückgesendet werden.

Es gibt verschiedene Arten von Filtern, die in den Spezifikationen vorgeschlagen werden -

  • Authentifizierungsfilter.
  • Datenkomprimierungsfilter.
  • Verschlüsselungsfilter.
  • Filter, die Ressourcenzugriffsereignisse auslösen.
  • Bildkonvertierungsfilter.
  • Protokollieren und Überwachen von Filtern.
  • MIME-TYPE-Kettenfilter.
  • Tokenisieren von Filtern.
  • XSL / T-Filter, die XML-Inhalte transformieren.

Filter werden in der Bereitstellungsdeskriptordatei bereitgestellt web.xml und ordnen Sie dann entweder Servlet-Namen oder URL-Mustern im Deployment-Deskriptor Ihrer Anwendung zu.

Wenn der Webcontainer Ihre Webanwendung startet, erstellt er eine Instanz jedes Filters, den Sie im Bereitstellungsdeskriptor deklariert haben. Die Filter werden in der Reihenfolge ausgeführt, in der sie im Bereitstellungsdeskriptor deklariert sind.

Servlet-Filtermethoden

Ein Filter ist einfach eine Java-Klasse, die die Schnittstelle javax.servlet.Filter implementiert. Die Schnittstelle javax.servlet.Filter definiert drei Methoden:

Sr.Nr. Methode & Beschreibung
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Diese Methode wird vom Container jedes Mal aufgerufen, wenn ein Anforderungs- / Antwortpaar aufgrund einer Clientanforderung für eine Ressource am Ende der Kette durch die Kette geleitet wird.

2

public void init(FilterConfig filterConfig)

Diese Methode wird vom Webcontainer aufgerufen, um einem Filter anzuzeigen, dass er in Betrieb genommen wird.

3

public void destroy()

Diese Methode wird vom Webcontainer aufgerufen, um einem Filter anzuzeigen, dass er außer Betrieb genommen wird.

Servlet-Filter - Beispiel

Im Folgenden finden Sie das Servlet-Filter-Beispiel, mit dem die IP-Adresse des Clients und die aktuelle Datums- und Uhrzeitangabe gedruckt werden. Dieses Beispiel vermittelt Ihnen ein grundlegendes Verständnis des Servlet-Filters. Sie können jedoch komplexere Filteranwendungen mit demselben Konzept schreiben:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) throws ServletException {
      
      // Get init parameter 
      String testParam = config.getInitParameter("test-param"); 

      //Print the init parameter 
      System.out.println("Test Param: " + testParam); 
   }
   
   public void  doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws java.io.IOException, ServletException {

      // Get the IP address of client machine.
      String ipAddress = request.getRemoteAddr();

      // Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time " + new Date().toString());

      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }

   public void destroy( ) {
      /* Called before the Filter instance is removed from service by the web container*/
   }
}

Kompilieren LogFilter.java wie gewohnt und legen Sie Ihre Klassendatei in <Tomcat-Installationsverzeichnis> / webapps / ROOT / WEB-INF / classes ab

Servlet-Filterzuordnung in Web.xml

Filter werden definiert und dann einer URL oder einem Servlet zugeordnet, ähnlich wie Servlet definiert und dann einem URL-Muster zugeordnet wird. Erstellen Sie den folgenden Eintrag für das Filter-Tag in der Deployment-Deskriptordateiweb.xml

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

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

Der obige Filter würde für alle Servlets gelten, da wir angegeben haben /*in unserer Konfiguration. Sie können einen bestimmten Servlet-Pfad angeben, wenn Sie Filter nur auf wenige Servlets anwenden möchten.

Versuchen Sie nun, ein Servlet wie gewohnt aufzurufen, und Sie sehen das generierte Protokoll in Ihrem Webserver-Protokoll. Sie können den Log4J-Logger verwenden, um sich über dem Protokoll in einer separaten Datei anzumelden.

Verwenden mehrerer Filter

Ihre Webanwendung definiert möglicherweise mehrere verschiedene Filter für einen bestimmten Zweck. Stellen Sie sich vor, Sie definieren zwei Filter, AuthenFilter und LogFilter . Der Rest des Prozesses bleibt wie oben erläutert, außer dass Sie eine andere Zuordnung erstellen müssen, wie unten erwähnt.

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>AuthenFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</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>

Filter Anwendungsreihenfolge

Die Reihenfolge der Filterzuordnungselemente in web.xml bestimmt die Reihenfolge, in der der Webcontainer den Filter auf das Servlet anwendet. Um die Reihenfolge des Filters umzukehren, müssen Sie nur die Filterzuordnungselemente in der Datei web.xml umkehren.

Das obige Beispiel würde beispielsweise zuerst LogFilter und dann AuthenFilter auf jedes Servlet anwenden, aber das folgende Beispiel würde die Reihenfolge umkehren -

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