wake-up-neo.net

Definieren der Ausführungsreihenfolge von Servlet-Filtern mithilfe von Anmerkungen in WAR

Wenn wir webapp-spezifische Servlet-Filter in WARs eigenem web.xml Definieren, stimmt die Reihenfolge der Ausführung der Filter mit der Reihenfolge überein, in der sie in web.xml Definiert sind.

Wenn wir diese Filter jedoch mit der Annotation @WebFilter Definieren, in welcher Reihenfolge werden die Filter ausgeführt, und wie können wir die Ausführungsreihenfolge bestimmen?

163
siva636

Sie können die Filterausführungsreihenfolge in der Tat nicht mit der Annotation @WebFilter definieren. Um die Verwendung von web.xml Zu minimieren, genügt es jedoch, alle Filter mit nur einem filterName zu versehen, sodass Sie nicht die Definition <filter>, Sondern nur ein <filter-mapping> Definition in der gewünschten Reihenfolge.

Beispielsweise,

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

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

mit in web.xml nur dies:

<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 in @WebFilter Beibehalten möchten, 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 {}

sie sollten jedoch den <url-pattern> in web.xml behalten, da er gemäß XSD erforderlich ist, obwohl er leer sein kann:

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

Unabhängig von der Vorgehensweise schlägt dies alles in Tomcat bis Version 7.0.28 fehl, da es bei Vorhandensein von <filter-mapping> Ohne <filter> Erstickt. Siehe auch Mit Tomcat funktioniert @WebFilter nicht mit <filter-mapping> in web.xml

177
BalusC

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

Sicher sein. Verwenden Sie die Filter für die Reihenfolge der web.xml-Dateien, die Abhängigkeiten aufweisen. Versuchen Sie, die Reihenfolge Ihrer Filter unabhängig zu machen, um die Verwendung einer web.xml-Datei zu minimieren.

11
vkraemer

@WebFilter hat kein Element, um die Reihenfolge der Filterausführung zu definieren. Wenn Sie es brauchen, sollten Sie sich für web.xml entscheiden.

0
luis-br