2009-08-24 13 views
20

Obiekt javax.servlet.Filter może być używany zarówno do uwierzytelniania (gdzie filtr musi przechwycić żądanie przed wykonaniem jakichkolwiek prac serwletu), jak i do tłumaczenia XSLT (gdzie serwlet musi być całkowicie gotowy do generowania treści). Kiedy faktycznie zostanie wykonany?Czy doFilter() jest wykonywany przed lub po zakończeniu pracy serwletu?

Wiem, że jest to zależne od implementacji (w pojemniku WWW), ale wydaje się, że problem ten musi zostać rozwiązany przez wszystkie z nich.

Być może jest gdzieś opcja konfiguracji dla każdej rejestracji Filtra w kontenerze sieciowym?

dodatkowe:

Ponadto, co reguluje kolejność wykonywania filtrów? Dlaczego FooFilter zostanie wykonany przed BarFilter?

+0

kolejność wykonywania filtracyjnej mogą być zawarte w pliku web.xml pomocą . Container przechwyci przepływy pracy programu z dostarczonymi filtrami zaczynając od góry do dołu. –

Odpowiedz

43

Łańcuch filtrów w istocie opakowuje wywołanie serwletu. Łańcuch przetworzy wszystkie odnośniki, dopóki nie dotrze do "dołu", następnie pozwoli serwletowi działać, a następnie przywróci łańcuch w odwrotnej kolejności. Na przykład, jeśli masz nową „przykład filtr”, twój doFilter metoda() może wyglądać następująco:

public void doFilter(ServletRequest request, 
     ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
// do pre-servlet work here 
chain.doFilter(request, response); 
// do post servlet work here 

} 
+0

To może być trochę wymyślne, ale co, jeśli chcę odrzucić odpowiedź? Innymi słowy, chcę powstrzymać reakcję w rzeczywistości? Czy jest to miejsce, w którym można rzucić wyjątek ServletException? –

+1

Wyrzucanie wyjątku ServletException nadal zwróciło "odpowiedź" na klienta, więc zależałoby od tego, co masz na myśli, nie zwracając odpowiedzi. Możesz utworzyć nowy obiekt odpowiedzi, z podaną tylko treścią i zwracaną, jeśli tak zdecydujesz. –

+0

Ah dobry punkt. Absolutnie żadna odpowiedź nigdy nie jest pożądana. Nawet jeśli doFilter() zwróci przed wywołaniem chain.doFilter(), nadal zwraca inną stronę błędu lub domyślnie coś innego. –

0

@Rich: Czy doFilter() wykonywane przed lub po pracy serwlet jest zrobione?

Filtr to program, który działa na serwerze przed serwletu lub strony JSP z którym jest związany.

+0

Skąd się tego cytuje? –

+0

Wygląda na cytowane z "Więcej serwletów i stron JavaServer" autorstwa Marty Hall. –

+0

@adatapost, ponieważ zawija to wywołanie, zostanie wywołane przed serwletem/jsp, ale odzyska kontrolę po przetworzeniu (jeśli inny filtr nie przerwał przetwarzania) –

7

alt text http://img228.imageshack.us/img228/8945/filter.png

O kolejności: jak pamiętam z pojemnika specyfikacja serwletu nie gwarantuje, że filtry będą nazywane w pewnym porządku.

+2

"Filtry są wywoływane w kolejności, w której pojawiają się odwzorowania filtrów na liście mapowania filtra dla WAR. Określasz listę odwzorowań filtrów dla WAR w jej deskryptorze wdrażania, kodując listę ręcznie z XML. "Odniesienie: http://docs.oracle.com/javaee/6/tutorial/doc /bnagb.html –

+3

Twój link do obrazu jest uszkodzony. – Bob

-1

Według specyfikacji servlet2.3 filtra odbywa się w zależności od konfiguracji web.xml z Filter sekwencji odwzorowywania rEF- http://www.programering.com/a/MTMyADOwATI.html

+0

Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby lepiej] (// meta.stackoverflow.com/q/8259), aby uwzględnić istotne części odpowiedzi tutaj, i podać link dla odniesienia. –

Powiązane problemy