Filter sind bereits seit der Version 2.3 Teil der Servlet-Spezifikation. Sie werden innerhalb des Servlet-Containers so geschaltet, dass ein Request für eine bestimmte Applikation immer erst durch den Filter geleitet wird, bevor er an bestimmte Servlets weitergeleitet wird. Filter unterbrechen die Request- und Response-Weiterleitung, so dass es möglich ist jeweilige Weiterleitung zu steuern und Anpassungen an beiden Objekten vorzunehmen.

Generell werden Filter für folgende Aufgaben eingesetzt:

  • Blockieren von Requests anhand der Autorisierung des Benutzers
  • Logging bzw. Auditierung der Webapplikation
  • Umwandlung von Bilder, wie bspw. Größenbegrenzung
  • Datenkompression, um ggf. Ladevorgänge zu optimieren

Filter sind Objekte, deren Klasse die Schnittstelle WebFilter implementieren. Diese Schnittstelle fordert die Implementierung der Methode
void doFilter(Request request, Response response, FilterChain chain)
In dieser Methode können nun anhand der beiden Objekte request und response Entscheidungen getroffen- bzw. diese Objekte verändert werden.  Der Parameter chain ist ein Objekt, das ggf. weitere Filter verwaltet. Wenn der Request weitergeleitet werden soll, so beauftragt man das FilterChain-Objekt mit der Nachricht doFilter(Request request, Response response). Die FilterChain wird den Request dann ggf. durch weitere Filter senden und am Ende evtl. an ein Servlet.

Zwei weitere Methoden dienen der Reaktion auf Lebenszyklus-Ereignisse und werden von der Filter-Schnittstelle auch gefordert. Die Methode init wird vom Servlet-Container aufgerufen, wenn das Filter-Objekt instanziiert wird und die Methode destroy, bevor das Filter-Objekt wieder zerstört wird.

Die typische Implementierung eines Filters hat folgendes Aussehen:

@WebFilter("/FilterUrl")
public class MeinFilter implements Filter {

	public void init(FilterConfig fConfig) throws ServletException {/*...*/}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// ggf. request begutachten
		// ggf. request und response bearbeiten
		
		chain.doFilter(request, response); // ggf. request weiterleiten (lassen)
		// ggf. response bearbeiten
	}

	public void destroy() {/*...*/}
}

Mit Hilfe der @WebFilter-Annotation wird dem Servlet-Container bekannt gemacht, dass es sich um einen Filter handelt. Als Parameter wird die URL spezifiziert für die der Filter vorgeschaltet werden soll. Ein Filter kann mit dem Parameter auch direkt vor ein Servlet geschaltet werden. In diesem Fall muss der Parametername explizit angegeben werden, also @WebFilter (servletNames="<name des Servlets>"). Der Name des Servlets ist hier nicht der Name der Klasse, sondern der Name, der in der entsprechenden Annotation des Servlets festgelegt wurde.