Natknęłam się na błąd w mojej aplikacji internetowej, który powodował, że przez chwilę drapałem się po głowie (i ostatecznie pociągając za włosy), zanim dowiedziałem się, co się dzieje."Kolejność wykonania filtrów serwletów"
Zasadniczo miałem 2 filtry zdefiniowane w moim web.xml, a dwa mapowania tak:
<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>
Są to zarówno filtry wiosny MVC. Mój problem polegał na tym, że dane formularzy, które otrzymałem, nie zostały zinterpretowane jako UTF-8, mimo że kodowanieFilter miało ustawić kodowanie żądania na UTF-8 zanim cokolwiek innego miało możliwość odczytania z niego.
wreszcie zauważyć, że filtr sposób forma została wykonana przed filtrem kodowania, chociaż kolejność mapowania filtry są zdefiniowane ma być kolejność w jakiej są one łańcuch:
Kolejność filtry w łańcuchu są takie same, jak kolejność odwzorowań filtrów w deskryptorze wdrażania aplikacji WWW.
(od Oracle)
Kiedy użyłem tego samego odwzorowania, czyli mapowania do serwletu zamiast wzorzec URL, zarówno dla odwzorowań, zlecenie zostanie przywrócone i wszystko działa zgodnie z przeznaczeniem:
<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>
Czy jest to część specyfikacji Servlet
, czy może to usterka Tomcata? Czy jest to gdzieś udokumentowane, czy powinienem przesłać raport o błędzie?
Używam Tomcat 7.0.39 z Java 7.
Dzięki, teraz wszystko jest bardziej przejrzyste. –