Z HandlerIntercepter
„s javadoc :
HandlerInterceptor
jest zasadniczo podobny do serwletu Filter
, ale w przeciwieństwie do tego drugiego, umożliwia po prostu niestandardowe przetwarzanie wstępne z opcją zakazania wykonywania samego modułu obsługi i niestandardowego przetwarzania końcowego. Filtry mają większe możliwości, na przykład umożliwiają wymianę obiektów żądań i odpowiedzi, które są przekazywane w łańcuchu. Zauważ, że filtr jest konfigurowany w web.xml
, a
HandlerInterceptor
w kontekście aplikacji.
Zgodnie z podstawową wytyczną, szczegółowe zadania przetwarzania wstępnego związane z procedurą obsługi są kandydatami do HandlerInterceptor
implementacji, w szczególności z uwzględnieniem wspólnego kodu procedury obsługi i kontroli autoryzacji. Z drugiej strony, a Filter
jest dobrze dostosowany do treści żądań i obsługi treści, takich jak formularze wieloczęściowe i kompresja GZIP. Zwykle pojawia się, gdy trzeba odwzorować filtr na określone typy treści (np. Obrazy) lub na wszystkie żądania.
Biorąc to pod uwagę:
Więc gdzie jest różnica między Interceptor#postHandle()
i
Filter#doFilter()
?
postHandle
zostanie wywołana po wywołaniu metody obsługi, ale przed renderowaniem widoku. Tak, można dodać więcej obiektów modelu do widoku, ale może nie zmienić HttpServletResponse
, ponieważ już popełnione.
doFilter
jest znacznie bardziej wszechstronny niż postHandle
. Możesz zmienić żądanie lub odpowiedź i przekazać je do łańcucha lub nawet zablokować przetwarzanie żądania.
Ponadto w programie preHandle
i postHandle
Methods masz dostęp do tego, HandlerMethod
który przetworzył żądanie. Możesz więc dodać logikę przetwarzania wstępnego / końcowego w oparciu o samą procedurę obsługi. Na przykład można dodać logikę dla metod obsługi, które mają pewne adnotacje.
Jaka jest najlepsza praktyka, w jakich przypadkach należy jej używać?
Jak wspomniano w dokumencie, drobnoziarniste zadania przetwarzania wstępnego związane z obsługą są kandydatami do HandlerInterceptor
implementacji, w szczególności z uwzględnieniem wspólnego kodu modułu obsługi i kontroli autoryzacji. Z drugiej strony, a Filter
jest dobrze dostosowany do treści żądań i obsługi treści, takich jak formularze wieloczęściowe i kompresja GZIP. Zwykle pojawia się, gdy trzeba odwzorować filtr na określone typy treści (np. Obrazy) lub na wszystkie żądania.
HandlerIntercepter
jest koncepcją specyficzną dla Springa. Aby zarejestrować filtr serwletów, możesz zarejestrować go przy użyciu staregoweb.xml
(Servlet 2.5 i starsze wersje) lub nowego podejścia programowego (Servlet 3+). PonieważHandlerIntercepter
jest to tylko abstrakcja wiosenna, powinieneś zarejestrować się w kontekście wiosnyWebApplication
jest jeden dla każdego wysyłającego, więc serwlet i filtr były powiązane z kontekstem, dobrą praktyką jest powiązanie przechwytywacza i filtru zrootContext
tak, jeśli u hv wielu dyspozytorów wszystkie mogą współużytkować to samo.Filtr : - Filtr, jak sugeruje nazwa, to klasa Java wykonywana przez kontener serwletów dla każdego przychodzącego żądania HTTP i dla każdej odpowiedzi http. W ten sposób możliwe jest zarządzanie przychodzącymi żądaniami HTTP, zanim dotrą one do zasobu, takiego jak strona JSP, serwlet lub prosta strona statyczna; w ten sam sposób można zarządzać odpowiedzią wychodzącą HTTP po wykonaniu zasobu.
Interceptor : - Spring Interceptors są podobne do Servlet Filters, ale działają w kontekście Spring Context, więc mają wiele możliwości zarządzania żądaniami i odpowiedziami HTTP, ale mogą implementować bardziej wyrafinowane zachowanie, ponieważ mają dostęp do całego kontekstu Spring.
źródło
HandlerInterceptor daje ci bardziej szczegółową kontrolę niż filtr, ponieważ masz dostęp do faktycznej docelowej "obsługi" - oznacza to, że każda czynność, którą wykonujesz, może się różnić w zależności od tego, co faktycznie robi żądanie (podczas gdy filtr serwletu jest stosowany ogólnie do wszystkich żądań - tylko możliwość uwzględnienia parametrów każdego żądania). Procedura handlerInterceptor zapewnia również 3 różne metody, dzięki czemu można zastosować zachowanie przed wywołaniem procedury obsługi, po zakończeniu procedury obsługi, ale przed renderowaniem widoku (gdzie można nawet całkowicie pominąć renderowanie widoku) lub po wyrenderowaniu samego widoku. Możesz także skonfigurować różne przechwytywacze dla różnych grup programów obsługi - przechwytywacze są skonfigurowane w module handlerMapping i może istnieć wiele funkcji handlerMappings.
Dlatego jeśli musisz zrobić coś zupełnie ogólnego (np. Logować wszystkie żądania), filtr jest wystarczający - ale jeśli zachowanie zależy od docelowej obsługi lub chcesz zrobić coś między obsługą żądania a renderowaniem widoku, wtedy HandlerInterceptor zapewnia taką elastyczność.
Źródła: http://static.springframework.org/sp...ng-interceptor
źródło