Przechwytujący wzór filtra
Filtr przechwytujący to wzorzec JavaEE , który tworzy podłączane filtry do przetwarzania typowych usług w standardowy sposób bez konieczności wprowadzania zmian w podstawowym kodzie przetwarzania żądań. Filtry przechwytują przychodzące żądania i wychodzące odpowiedzi, umożliwiając przetwarzanie wstępne i końcowe, a filtry te można dyskretnie dodawać lub usuwać bez zmiany istniejącego kodu. Ten wzorzec w przejrzysty sposób stosuje przetwarzanie wielokrotnego użytku przed i po faktycznym wykonaniu żądania przez kontrolery frontowe i strony.
Struktura
Menedżer filtrów, łańcuch filtrów, filtry i cel są składnikami wzorca.
Menedżer filtrów
To zarządza przetwarzaniem filtrów i tworzy łańcuch filtrów z odpowiednimi filtrami we właściwej kolejności i inicjuje przetwarzanie.
Łańcuch filtrów
Łańcuch filtrów to specyficzna seria filtrów, skomponowana w taki sposób, aby tworzyły logiczny łańcuch.
Filtry
Są to indywidualne filtry, które są mapowane na cel, a ich przetwarzanie jest koordynowane przez łańcuch filtrów.
Cel
Jest to zasób żądany przez klienta.
Konsekwencje
Można rozważyć następujące korzyści:
- Ulepszona możliwość ponownego użycia: wspólny kod jest scentralizowany w komponentach podłączanych, co ułatwia ponowne wykorzystanie.
- Zwiększona elastyczność: Ogólne wspólne komponenty mogą być deklaratywnie stosowane i usuwane, co zwiększa elastyczność.
Zmniejszona wydajność może stanowić problem, ponieważ niepotrzebnie długie łańcuchy przechwytywaczy i filtrów mogą obniżyć wydajność.
Przykładowy kod
Przykładowa implementacja kodu dla filtrów z niestandardową strategią filtrowania jest podana poniżej.
Kod implementujący filtr - filtr debugujący:
klasa publiczna DebuggingFilter implementuje Processor { private Processor target ; public DebuggingFilter ( procesor myTarget ) { target = myTarget ; } public void wykonanie ( ServletRequest req , ServletResponse res ) zgłasza wyjątek IOException , ServletException {
//Przeprowadź tutaj przetwarzanie filtrów, na przykład // wyświetlanie parametrów żądania target . wykonaj ( req , res ); } }
Kod implementujący filtr - procesor rdzeniowy:
klasa publiczna CoreProcessor implementuje procesor { prywatny cel procesora ; publiczny CoreProcessor () { this ( null ); } public CoreProcessor ( Procesor myTarget ) { target = myTarget ; } public void wykonaj ( ServletRequest req , ServletResponse res
) zgłasza wyjątek IOException , ServletException { //Tutaj wykonaj podstawowe przetwarzanie } }
Kod do obsługi zgłoszeń:
public void processRequest ( ServletRequest req , ServletResponse res ) rzuca IOException , ServletException { Procesory procesorów = nowy filtr debugowania ( nowy filtr uwierzytelniania ( nowy CoreProcessor ())); procesory . wykonaj ( req , res ); //Następnie wysyłamy do następnego zasobu, którym prawdopodobnie jest
// Widok do wyświetlenia dyspozytora . wysyłka ( req , res ); }
Kod menedżera filtrów:
public void processRequest ( ServletRequest req , ServletResponse res ) rzuca IOException , ServletException { Procesory procesorów = nowy filtr debugowania ( nowy filtr uwierzytelniania ( nowy CoreProcessor ())); procesory . wykonaj ( req , res ); //Następnie wysyłamy do następnego zasobu, którym prawdopodobnie jest
// widok do wyświetlenia dyspozytora . wysyłka ( req , res ); }
Kod łańcucha filtrów:
public class FilterChain { // łańcuch filtrów // zastosuj filtry dla ( final Filter filter : filtry ) { // przepuść żądanie i odpowiedź przez różne // filtry filter . wykonaj ( żądanie , odpowiedź ); } } }
Zobacz też
- Kontroler przedni
- Wzór dekoratora
- Wzór metody szablonowej
- Wzór przechwytujący
- Rurociąg (oprogramowanie)