2013-06-13 12 views
29

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.

Odpowiedz

41

Gdy pojemnik recives wniosek, najpierw wyszukuje wszystkie mapowania filtrów z <url-pattern> który pasuje do żądania URI. To staje się pierwszym zestawem filtrów w łańcuchu filtrów. Następnie znajduje wszystkie mapowania filtrów o wartości <servlet-name>, które pasują do identyfikatora URI żądania. Staje się to drugim zestawem filtrów w łańcuchu filtrów.W obu zestawach filtry są wykonywane w kolejności, w jakiej są zadeklarowane w D.D.

Według specs

Kolejność pojemnik wykorzystuje w budowaniu łańcucha filtrów, które będą stosowane do szczególności żądanie URI jest następujący:

  1. pierwsze, filtra <url-pattern> dopasowanie odwzorowania w tej samej kolejności, w której te elementy pojawiają się w deskryptorze wdrażania.
  2. Następnie filtr dopasowujący dopasowuje się w tej samej kolejności, w jakiej znajdują się te elementy w deskryptorze wdrażania.
+0

Dzięki, teraz wszystko jest bardziej przejrzyste. –

-5

Dodatkowo można zdefiniować kolejność stosowania filtrów. Można to osiągnąć dodając następujące wiersze w web.xml:

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

Sprawdź this celu uzyskania dalszych informacji.

+8

** to absolutnie nie tak, zewnętrzny znacznik jest dla fragmentów, a nie filtrów ** –