Servlets filtern
Für das Filtern von Servletswird ein neuer Typ von Objekt, ein sogenannter Filter eingeführt, der eine Anforderung umsetzen oder eine Antwort ändern können.
Sie können Filter verketten, sodass eine Gruppe von Filtern auf die Eingabe und Ausgabe einer angegebenen Ressource oder Ressourcengruppe wirken kann.
Typische Filter sind Protokollfilter, Bildkonvertierungsfilter, Verschlüsselungsfilter und Filter für MIME-Typen (funktional äquivalent zur Servletverkettung). Filter sind zwar keine Servlets, der Lebenszyklus ist jedoch sehr ähnlich.
Filter werden wie folgt behandelt:
- Der Web-Container stellt fest, ob er eine Filterkette
mit dem Protokollfilter für die angeforderte Ressource erstellen muss.
Die Filterkette beginnt mit dem Aufruf des Protokollfilters und endet mit dem Aufruf der angeforderten Ressource.
- Falls andere Filter in die Kette aufgenommen werden müssen, fügt der Web-Container sie hinter theLoggingFilter und vor der angeforderten Ressource ein.
- Der Web-Container instanziert und initialisiert den Protokollfilter (sofern dies noch nicht geschehen ist) und ruft seine Methode doFilter(FilterConfig) auf, um die Filterkette zu starten.
- Der Protokollfilter führt eine Vorverarbeitung der Anforderungs- und Antwortobjekte
durch und ruft dann die Methode doFilter(ServletRequest, ServletResponse)
der Filterkette auf.
Diese Methode gibt die Verarbeitung an die nächste Ressource in der Kette weiter (in diesem Fall an die angeforderte Ressource).
- Sobald die Antwort von der Methode doFilter(ServletRequest, ServletResponse) der Filterkette zurückgegeben wurde, führt der Protokollfilter die Nachbearbeitung der Anforderungs- und Antwortobjekte durch, bevor er die Antwort an den Client zurücksendet.
Mit Java™ Servlet Specification 2.4 können Sie im Implementierungsdeskriptor ein neues <dispatcher>-Element mit gültigen Werten (REQUEST, FORWARD, INCLUDE, ERROR) definieren, anstatt Filter mit RequestDispatcher aufzurufen.
Mit Java Servlet Specification 3.0 können Sie im Implementierungsdeskriptor ein neues <dispatcher>-Element mit gültigen Werten (ASYNC, REQUEST, FORWARD, INCLUDE, ERROR, INCLUDE) definieren, anstatt Filter mit RequestDispatcher aufzurufen.
<filter-mapping>
<filter-name>Logging Filter</filter-name>
<url-pattern>/products/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Dieses Beispiel zeigt an, dass der Filter auf Anforderungen, die direkt vom Client ausgeführt werden, und FORWARD-Anforderungen angewendet werden soll. Durch Hinzufügen der Werte INCLUDE und ERROR wird auch angezeigt, dass der Filter darüber hinaus auf eingeschlossene Anforderungen und <error-page>-Anforderungen angewendet werden soll. Falls Sie keine <dispatcher>-Elemente angeben, wird standardmäßig der Wert REQUEST verwendet.
Klassen Filter, FilterChain, FilterConfig für Filtern von Servlets
Die folgenden Interfaces sind als Teil des Pakets javax.servlet definiert:
- Schnittstelle Filter - Methoden: doFilter, getFilterConfig, setFilterConfig
- Schnittstelle FilterChain - Methoden: doFilter
- Schnittstelle FilterConfig - Methoden: getFilterName, getInitParameter, getInitParameterNames, getServletContext
Die folgenden Klassen sind als Teil des Pakets "javax.servlet" definiert:
- HttpServletRequestWrapper - Methoden: siehe die Spezifikation Servlet 2.4
- HttpServletResponseWrapper - Methoden: siehe die Spezifikation Servlet 2.4