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ż