So definieren Sie die Ausführungsreihenfolge des Servlet-Filters mithilfe von Anmerkungen in WAR

167

Wenn wir webapp-spezifische Servlet-Filter in WARs eigenen definieren web.xml, entspricht die Ausführungsreihenfolge der Filter der Reihenfolge, in der sie in der definiert sind web.xml.

Wenn wir diese Filter jedoch mithilfe von @WebFilterAnmerkungen definieren, wie ist die Ausführungsreihenfolge der Filter und wie können wir die Ausführungsreihenfolge bestimmen?

siva636
quelle

Antworten:

187

Sie können die Filterausführungsreihenfolge in der Tat nicht mithilfe von @WebFilterAnmerkungen definieren. Um die web.xmlVerwendung zu minimieren , ist es jedoch ausreichend, alle Filter mit nur einem zu versehen, filterNamesodass Sie nicht die <filter>Definition, sondern nur eine <filter-mapping>Definition in der gewünschten Reihenfolge benötigen .

Beispielsweise,

@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}

mit in web.xmlnur diesem:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/url1/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/url2/*</url-pattern>
</filter-mapping>

Wenn Sie das URL-Muster beibehalten möchten @WebFilter, können Sie dies einfach tun:

@WebFilter(filterName="filter1", urlPatterns="/url1/*")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2", urlPatterns="/url2/*")
public class Filter2 implements Filter {}

aber Sie sollten immer noch die halten <url-pattern>in web.xml, weil es laut XSD erforderlich ist, obwohl es leer sein:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern />
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern />
</filter-mapping>

Unabhängig vom Ansatz wird dies alles in Tomcat bis zur Version 7.0.28 fehlschlagen, da es bei Vorhandensein von <filter-mapping>ohne erstickt <filter>. Siehe auch Bei Verwendung von Tomcat funktioniert @WebFilter nicht mit <filter-mapping> in web.xml

BalusC
quelle
5
Sie hätten ein orderAttribut einer verschachtelten @WebFilterMappingAnnotation einführen können . Ich frage mich, ob die es der Einfachheit halber nicht getan haben
Bozho
12
@Bozho: Das wäre nicht spezifisch genug. Was ist, wenn Ihre Webanwendung mit Bibliotheken von Drittanbietern geliefert wird, die einen Filter enthalten? Es ist schwer, die Reihenfolge vorher zu sagen.
BalusC
1
@BalusC: In Ihrem Beispiel ist ein Fehler aufgetreten: Das URL-Muster wird mit einem Filternamen geschlossen.
Andrew Bourgeois
3
@ AndrewBourgeois: Behoben. War ein Copypaste-Fehler. Schade, dass der Markdown-Editor keine eingebaute XML-Validierung wie in Eclipse hat;)
BalusC
6
Die Verwendung <url-pattern />funktioniert in JBoss EAP 6.1 nicht - es überschreibt den @WebFilterWert und verhindert, dass der Filter überhaupt ausgeführt wird.
Seanf
12

Die Servlet 3.0-Spezifikation scheint keinen Hinweis darauf zu geben, wie ein Container Filter bestellen soll, die über Anmerkungen deklariert wurden. Es ist jedoch klar, wie Filter über ihre Deklaration in der Datei web.xml bestellt werden können.

Sicher sein. Verwenden Sie die Dateibestellungsfilter web.xml, die voneinander abhängig sind. Versuchen Sie, die Reihenfolge Ihrer Filter unabhängig zu gestalten, um die Verwendung einer web.xml-Datei zu minimieren.

vkraemer
quelle
4
Ich habe viele Servlet-Filter in meinem Projekt, von denen nur ein bestimmter Filter zuerst aufgerufen werden muss und die Reihenfolge anderer Filter kein Problem darstellt. Muss ich alle Filter in web.xml verunreinigen? Oder gibt es Abkürzungen?
Siva636