Homepage-Webhilfe Event-Banner

Filter

Filter-Icon Filter sind eine spezielle Technologie für Java-Webanwendungen, welche es erlauben, vor oder nach dem Ausführen des eigentlichen Servlets, bestimmte Anweisungen auszuführen bzw. das Ausführen zu unterbinden. Typische Beispiele zur Verwendung von Filtern sind Authentifizierung (z. B. für einen geschützten Bereich auf der Website), Protokollierung (z. B. das Protokollieren von Zugriffen auf bestimmte Ressourcen), Komprimierung und Verschlüsselung.

Filter sind ganz normale Java-Klassen, die das Interface Filter (Package javax.servlet) implementieren. Das Filter-Interface bietet 3 Funktionen, welche überschrieben werden können: init(), doFilter() und destroy(). Die Funktionen init() und destroy() werden auch hier üblicherweise zum Allokieren und Freigeben von Ressourcen verwendet. Der init()-Methode wird ein Objekt des Interfaces FilterConfig übergeben, welches die Konfiguration des Filters enthält. Eine solche Konfiguration kann über die web.xml-Datei festgelegt werden. Ein typisches Beispiel für die Verwendung einer solchen Konfiguration wäre ein Wartungs-Flag: Ist das Flag gesetzt, so wird auf eine Wartungsseite umgeleitet, andernfalls wird die angefragte Ressource abgerufen. Die Methode doFilter() ist die Funktion, welche vom Servlet-Container aufgerufen wird. Als Übergabeparameter erhalten Sie ein Objekt des ServletRequest- und ServletResponse-Interfaces sowie des FilterChain-Interfaces. Um das eigentliche Servlet bzw. die weiteren Filter (wenn es mehrere Filter gibt, die auf die angefragte URL zutreffen) aufzurufen, wird die Methode doFilter() des FilterChain-Objekts aufgerufen.

Filter müssen im Deployment Descriptor (Datei web.xml) konfiguriert werden. Dafür müssen wir als erstes den Filter „bekanntmachen“ und diesem einen lokalen Namen geben. Hier kommen, ähnlich wie bei Servlets, die XML-Elemente filter, filter-name und filter-class zum Einsatz.

<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>de.hwh.bsp.filter.LogFilter</filter-class>
</filter>

Als nächstes müssen wir dem Filter ein URL-Muster zuordnen. Dieses wird im XML-Element url-pattern angegeben. So wie bei Servlets auch, kann hier ein Wildcard-Zeichen * verwendet werden (siehe Beispiel).

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

Beim Erstellen eines Filters in NetBeans werden die lokalen Methoden doBeforeProcessing() und doAfterProcessing() in der Java-Klasse angelegt, wovon die eine vor dem und die andere nach dem das eigentliche Servlet ausgeführt wird, aufgerufen wird. Der Aufruf der Funktion doFilter(), welche die Filter-Kette (engl. filter chain) aufruft, steht dabei zwischen dem Aufruf von doBeforeProcessing() und doAfterProcessing(). Der Assistent zum Anlegen eines Filters in NetBeans kann auch die Konfiguration im Deployment Descriptor für Sie übernehmen.

Hier nun ein Beispielprojekt, bei welchem die Remote-IP-Adresse und der Inhaltstyp in die Konsole geloggt werden.

Filter (LogFilter.java):

package de.hwh.bsp.filter;

import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LogFilter implements Filter
{
    private void doBeforeProcessing(ServletRequest request, ServletResponse response)
    {
        System.out.println((new Date()).toString() + ":");
        System.out.println(" Zugriff von " + request.getRemoteAddr());
    }    
    
    private void doAfterProcessing(ServletRequest request, ServletResponse response)
    {
        System.out.println(" Rückgabe als " + response.getContentType());
    }
    
    @Override
    public void init(FilterConfig filterConfig)
    {
        // Ressourcen allokieren und Initialisierung ausführen
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    {
        // Filter-Funktion bevor die Anfrage bearbeitet wurde ausführen
        doBeforeProcessing(request, response);
        
        // Anfrage versuchen zu bearbeiten
        try
        {
            chain.doFilter(request, response);
        }
        catch (IOException eIO)
        {
            System.out.println(eIO.toString());
        }
        catch (ServletException eIO)
        {
            System.out.println(eIO.toString());
        }
        
        // Filter-Funktion nachdem die Anfrage bearbeitet wurde ausführen
        doAfterProcessing(request, response);
    }
    
    @Override
    public void destroy()
    {
        // Ressourcen freigeben
    }
}

Servlet (LogServlet.java):

package de.hwh.bsp.filter;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogServlet extends HttpServlet
{
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        // Ausgabe als Text-Datei
        response.setContentType("text/plain;charset=UTF-8");
        
        // Ausgabe durchführen
        PrintWriter out = response.getWriter();
        out.println("Ihre IP-Adresse ist: " + request.getRemoteAddr());
        out.println("Die Antwort wird gesendet als: " + response.getContentType());
        out.close();
    }
}

Konfiguration (web.xml):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <filter>
        <filter-name>LogFilter</filter-name>
        <filter-class>de.hwh.bsp.filter.LogFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LogFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>LogServlet</servlet-name>
        <servlet-class>de.hwh.bsp.filter.LogServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>
VorschauDownload
Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen OK