2013-06-13 24 views
29

Mi sono imbattuto in un errore nella mia applicazione web che mi ha fatto grattarmi la testa (e alla fine mi tirava i capelli) per un po 'prima di scoprire cosa stava succedendo.Ordine di esecuzione dei filtri servlet

Fondamentalmente, ho avuto 2 filtri definiti nel mio web.xml, e le due mappature del genere:

<filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <servlet-name>SpringMVCDispatcher</servlet-name> 
</filter-mapping> 

<filter-mapping> 
    <filter-name>SpringFormMethodFilter</filter-name> 
    <url-pattern>/administration/*</url-pattern> 
</filter-mapping> 

Sono entrambi filtri Spring MVC. Il mio problema era che i dati del modulo che ho ricevuto non sono stati interpretati come UTF-8, nonostante il fatto che encodingFilter avrebbe dovuto impostare la codifica della richiesta su UTF-8 prima che qualcos'altro avesse l'opportunità di leggerlo.

fine ho notato che il filtro metodo modulo è stato eseguito prima del filtro di codifica, anche se l'ordine in cui sono definiti mapping filtro dovrebbe essere l'ordine in cui vengono concatenati:

L'ordine del i filtri nella catena sono gli stessi dell'ordine in cui i mapping dei filtri vengono visualizzati nel descrittore di distribuzione dell'applicazione Web.

(da Oracle)

Quando ho usato la stessa mappatura, cioè la mappatura di una servlet, invece di un modello di URL, per entrambe le mappature, l'ordine viene ripristinato e tutto funziona come previsto:

<filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <servlet-name>SpringMVCDispatcher</servlet-name> 
</filter-mapping> 

<filter-mapping> 
    <filter-name>SpringFormMethodFilter</filter-name> 
    <servlet-name>SpringMVCDispatcher</servlet-name> 
</filter-mapping> 

Questa parte della specifica Servlet o è un problema tecnico di Tomcat? È documentato da qualche parte, dovrei inviare un bug report?

Sto usando Tomcat 7.0.39 con Java 7.

risposta

41

Quando il contenitore sono inviate tutte una richiesta, prima trova tutti i mapping di filtro con un <url-pattern> che corrisponde l'URI della richiesta. Questo diventa il primo set di filtri nella catena di filtri. Successivamente trova tutti i mapping dei filtri con un <servlet-name> che corrisponde all'URI della richiesta. Questo diventa il secondo set di filtri nella catena di filtri. In entrambi i set i filtri vengono eseguiti nell'ordine in cui sono dichiarati nel D.D.

Secondo la specs

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

  1. Innanzitutto, il filtro <url-pattern> corrispondenza mappature nello stesso ordine in cui questi elementi vengono visualizzati nel descrittore di distribuzione.
  2. Successivamente, le associazioni di filtri corrispondenti <servlet-name> nello stesso ordine in cui questi elementi vengono visualizzati nel descrittore di distribuzione.
+0

Grazie, ora è tutto più chiaro. –

-5

Inoltre, è possibile definire l'ordine in cui vengono applicati i filtri. Questo può essere ottenuto aggiungendo le seguenti righe nel web.xml:

<absolute-ordering> 
    <name>encodingFilter</name> 
    <name>SpringFormMethodFilter</name> 
</absolute-ordering> 

Controllare this per ulteriori informazioni.

+8

** questo è assolutamente sbagliato, quel tag esterno è per frammenti non filtri ** –

Problemi correlati