차단 필터 모드


가로채기 필터 패턴

가로채기 필터 패턴은 애플리케이션 요청 또는 응답의 일부 전처리/후처리를 수행하는 데 사용됩니다. 필터는 실제 대상 애플리케이션에 전달되기 전에 요청에 정의되고 적용됩니다. 필터는 인증/권한 부여/로깅을 수행하거나 요청을 추적한 다음 해당 요청을 적절한 핸들러에 전달할 수 있습니다. 다음은 이 디자인 패턴의 엔터티입니다.

  • Filter - 필터는 요청 핸들러가 요청을 실행하기 전이나 후에 특정 작업을 수행합니다.

  • Filter Chain - 필터 체인은 여러 필터를 전달하고 Target에서 정의된 순서로 실행합니다.

  • Target - 대상 개체는 요청 처리기입니다.

  • Filter Manager - 필터 관리자는 필터와 필터 체인을 관리합니다.

  • Client - 클라이언트는 Target 개체에 요청을 보내는 개체입니다.

Implementation

엔티티를 나타내는 다양한 객체로 FilterChain, FilterManager, Target, Client을 생성하겠습니다. AuthenticationFilterDebugFilter는 엔터티 필터를 나타냅니다.

InterceptingFilterDemo, 데모 클래스에서는 Client를 사용하여 차단 필터 설계 패턴을 보여줍니다.

interceptingfilter_pattern_uml_diagram.jpg

1단계

필터 인터페이스 필터를 만듭니다.

Filter.java

public interface Filter {
   public void execute(String request);
}

2단계

엔티티 필터를 만듭니다.

AuthenticationFilter.java

public class AuthenticationFilter implements Filter {
   public void execute(String request){
      System.out.println("Authenticating request: " + request);
   }
}

DebugFilter.java

public class DebugFilter implements Filter {
   public void execute(String request){
      System.out.println("request log: " + request);
   }
}

3단계

대상을 생성합니다.

Target.java

public class Target {
   public void execute(String request){
      System.out.println("Executing request: " + request);
   }
}

4단계

필터 체인을 생성합니다.

FilterChain.java

import java.util.ArrayList;
import java.util.List;

public class FilterChain {
   private List<Filter> filters = new ArrayList<Filter>();
   private Target target;

   public void addFilter(Filter filter){
      filters.add(filter);
   }

   public void execute(String request){
      for (Filter filter : filters) {
         filter.execute(request);
      }
      target.execute(request);
   }

   public void setTarget(Target target){
      this.target = target;
   }
}

5단계

필터 관리자를 만듭니다.

FilterManager.java

public class FilterManager {
   FilterChain filterChain;

   public FilterManager(Target target){
      filterChain = new FilterChain();
      filterChain.setTarget(target);
   }
   public void setFilter(Filter filter){
      filterChain.addFilter(filter);
   }

   public void filterRequest(String request){
      filterChain.execute(request);
   }
}

6단계

클라이언트 클라이언트를 생성합니다.

Client.java

public class Client {
   FilterManager filterManager;

   public void setFilterManager(FilterManager filterManager){
      this.filterManager = filterManager;
   }

   public void sendRequest(String request){
      filterManager.filterRequest(request);
   }
}

7단계

Client를 사용하여 인터셉터 필터 설계 패턴을 시연합니다.

FrontControllerPatternDemo.java

public class InterceptingFilterDemo {
   public static void main(String[] args) {
      FilterManager filterManager = new FilterManager(new Target());
      filterManager.setFilter(new AuthenticationFilter());
      filterManager.setFilter(new DebugFilter());

      Client client = new Client();
      client.setFilterManager(filterManager);
      client.sendRequest("HOME");
   }
}

8단계

출력을 확인합니다.

rreee