Inspiracja , wiedza , realizacja
Jsystems

W przebudowie

Login



Java

Oracle

Linux

Android

PostgreSQL

Microsoft SQL Server

Przechwytywacze

Data dodania: Jun 27, 2016
Data aktualizacji: Jun 27, 2016

Kod źródłowy z przykładami do tego rozdziału możesz pobrać pod adresem:

http://jsystems.pl/storage/spring/springmvc8.zip


Przechwytywacze to bardzo przydatne narzędzie pozwalające na kontrolę przepływu. Dzięki nim możemy wykonywać operacje przed każdym wywołaniem, po nim ale przed renderowaniem widoku lub na sam koniec. Gdzie to się może przydać? Od monitoringu wydajności (liczymy czas od wywołania do zakończenia całej operacji) , do czegoś w rodzaju filtrów – np. Ograniczających dostęp do wybranych podstron ze wskazanych adresów IP.


Zaczynamy od dodania klasy implementującej interfejs HandlerInterceptor ( org.springframework.web.servlet.HandlerInterceptor ).



Będziemy musieli zaimplementować trzy metody wymagane przez ten interfejs.

PreHandle – jest wywoływana przed kontrolerem obsługującym dane żądanie. Metoda ta zwraca true lub false, a w zależności od tego co zwróci – request jest przekazywany do kontrolera lub nie. Jeśli zwróci true, kontroler przejmie dalszą obsługę żądania. I to jest miejsce gdzie moglibyśmy np ograniczyć dostęp do wybranych adresów z jakiejś wybranej puli adresowej.

PostHandle – jest wywoływana po zadziałaniu kontrolera, ale jeszcze przed renderowaniem widoku. Pozwala też manipulować na danych modelu przed wyświetleniem widoku. To może być miejsce gdzie byśmy ograniczyli wyświetlane dane w zależności od tego jaki zalogowany użytkownik ich żąda.

AfterCompletion – wywoływana na koniec, już po zrenderowaniu i wyswietleniu widoku. Tę metodę moglibyśmy wykorzystać do wyliczania czasu przetworzenia całego żądania.


Zamiast implementować interfejs HandlerInterceptor, możesz dziedziczyć po klasie HandlerInterceptorAdapter i przesłonić tylko wybrane metody. Jak kto woli, jak komu wygodnie :)

W tym pierwszym przykładzie ograniczam się tylko do wyswietlenia stosownych komunikatów w poszczególnych metodach – to nam pozwoli zaobserwować kolejność wykonywanych operacji.


Dodaję też zwyczajny kontroler z metodą obsługującą żądanie http:



Zawartość pliku *****-servlet została wzbogacona o fragment z tagami <mvc:interceptors>:



Działa to w ten sposób, że przy każdym żądaniu Dispatcher przetwarza listę interceptorów i wywołuje dla każdego z nich stosowne interceptory. Możesz pomiędzy tagami <mvc:interceptors> i

</ mvc:interceptors> wstawić kolejne beany z odwołaniami do klas implementujących interfejst HandlerInterceptor lub dziedziczących po klasie HandlerInterceptorAdapter i wszystkie one będą wywoływane.


Wywołuję adres obsługiwany przez nasz kontroler:



Drobna uwaga – jedna z pierwszych myśli jaka mi przyszła do głowy po zapoznaniu się z tym mechanizmem – to czy można ograniczyć działanie interceptorów tylko do wybranych adresów? Przykładowo jakiejś pilnie strzeżonej części aplikacji? W samej konfiguracji interceptorów tego nie ustawimy, możemy za to stosunkowo łatwo sobie to samemu zaimplementować, wykorzystując fakt że w interceptorze mamy cały czas dostęp do obiektu klasy HttpServlerRequest naszego żądania.

Przykładowy kod mógłby wyglądać tak:


if(request.getRequestURI.endsWith("tajnapodstrona")) {

response.sendRedirect("zalogujSieNajpierw.do");

}