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.
Grazie, ora è tutto più chiaro. –