Come definire l'ordine di esecuzione del filtro servlet usando le annotazioni in WAR


167

Se definiamo i filtri servlet specifici di webapp in WAR web.xml, l'ordine di esecuzione dei filtri sarà lo stesso dell'ordine in cui sono definiti nellaweb.xml .

Ma se definiamo quei filtri usando l' @WebFilterannotazione, qual è l'ordine di esecuzione dei filtri e come possiamo determinare l'ordine di esecuzione?

Risposte:


187

In effetti, non è possibile definire l'ordine di esecuzione del filtro mediante l' @WebFilterannotazione. Tuttavia, per ridurre al minimo l' web.xmlutilizzo, è sufficiente annotare tutti i filtri con solo un filterNamemodo che non sia necessaria la <filter>definizione, ma solo una <filter-mapping>definizione nell'ordine desiderato.

Per esempio,

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

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

con web.xmlproprio in questo:

<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>

Se desideri mantenere attivo il pattern URL @WebFilter, puoi farlo in questo modo,

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

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

ma dovresti comunque tenerlo <url-pattern>dentro web.xml, perché è richiesto come da XSD, anche se può essere vuoto:

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

Indipendentemente dall'approccio, tutto ciò fallirà in Tomcat fino alla versione 7.0.28 perché soffoca in presenza di <filter-mapping>senza <filter>. Vedi anche Utilizzando Tomcat, @WebFilter non funziona con <filter-mapping> all'interno di web.xml


5
avrebbero potuto introdurre un orderattributo di @WebFilterMappingun'annotazione nidificata . Mi chiedo se non lo abbia fatto per semplicità
Bozho,

12
@ Bozho: Non sarebbe abbastanza specifico. Cosa succede se la tua webapp viene fornita con librerie di terze parti che includono un filtro? È difficile dirlo in anticipo al suo ordine.
BalusC,

1
@BalusC: qualcosa è andato storto nel tuo esempio: url-pattern è chiuso con un nome-filtro.
Andrew Bourgeois,

3
@AndrewBourgeois: risolto. Si è verificato un errore di copypaste. Peccato che l'editor Markdown non abbia la convalida XML incorporata come in Eclipse;)
BalusC

6
L'uso <url-pattern />non funziona su JBoss EAP 6.1: sovrascrive il @WebFiltervalore e impedisce al filtro di funzionare.
seanf,

12

Le specifiche Servlet 3.0 non sembrano fornire un suggerimento su come un contenitore dovrebbe ordinare i filtri che sono stati dichiarati tramite annotazioni. È chiaro come su come ordinare i filtri tramite la loro dichiarazione nel file web.xml.

Stai attento. Utilizzare i filtri per l'ordine dei file web.xml con interdipendenze. Cerca di rendere indipendenti tutti i tuoi filtri per ridurre al minimo la necessità di utilizzare un file web.xml.


4
Ho molti filtri Servlet nel mio progetto, tra questi solo un particolare filtro deve essere chiamato per primo e l'ordine di altri filtri non è un problema. Devo contaminare tutti i filtri in web.xml? O ci sono scorciatoie?
siva636,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.