2011-10-29 12 views
8

Supponiamo che io ho seguito nel mio web.xmlQuale sarà l'ordine in cui verranno chiamati i filtri?

<filter-mapping> 
    <filter-name>F1</filter-name> 
    <url-pattern>/XYZ/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>F2</filter-name> 
    <url-pattern>/XYZ/abc.do</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>F3</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Quale sarà l'ordine in cui saranno chiamati i filtri se arriva una richiesta da /XYZ/abc.do.And perché?

risposta

12

Nell'ordine loro mappature sono definiti in web.xml

Se utilizzando annotazioni (@WebFilter) l'ordine seems to be undefined - si devono ancora dichiarare le <filter-mapping> voci in web.xml.

+0

quindi F1, F2, F3? Cosa succede se si tratta di servlet? Diciamo che ho 1 modello che corrisponde a 2 servlet? –

+1

non importa quante servlet/uris corrisponde. La risorsa di destinazione corrente è solo una, e per essa i filtri sono richiamati nell'ordine della dichiarazione di mappatura. (Quindi sì - F1, F2, F3) – Bozho

+0

sì, ho capito. Ma ora sto chiedendo a uno scenerio completamente separato dove lo stesso url patter corrisponde a 2 diversi servlet s1 e s2. Che servlet verrà chiamato? Questo quesiton è indipendente da filtri –

14

sezione 6.2.4 della Servlet specification 3.0:

Durante l'elaborazione di un elemento <filter-mapping> utilizzando lo stile <url-pattern>, il contenitore deve stabilire se il <url-pattern> corrisponde l'URI della richiesta utilizzando le regole di mappatura percorso definito nel Capitolo 12, “ Mappatura delle richieste ai servlet ".

L'ordine del contenitore usa nella costruzione della catena di filtri da applicare una particolare richiesta URI è il seguente:

  1. Innanzitutto, i <url-pattern> mapping filtro corrispondente nello stesso ordine in cui questi elementi appaiono in il descrittore di implementazione.

  2. Successivamente, le associazioni di filtri corrispondenti <servlet-name> nello stesso ordine in cui questi elementi vengono visualizzati nel descrittore di distribuzione.

Se una mappatura di filtro contiene sia <servlet-name> e <url-pattern>, il contenitore deve espandere la mappatura del filtro in più mappature filtro (uno per ogni <servlet-name> e <url-pattern>), preservando l'ordine degli elementi <servlet-name> e <url-pattern>.

In breve: vengono applicati nell'ordine in cui compaiono nel file XML. Diventa interessante se si colpisce un URL coperto da entrambi i filtri associati a <url-pattern> e <servlet-name>, poiché tutti i filtri associati a pattern URL vengono applicati prima di tutti i filtri associati a nome servlet. Non sono mai stato in questa situazione (non ho visto alcun filtro associato a nome servlet), ma penso che potrebbe essere abbastanza confuso.

Problemi correlati