Creational Design Patterns

Structural Design Patterns

Behavioral Design Patterns

J2EE Design Patterns

Design Patterns Useful Resources

Design Pattern - Intercepting Filter Pattern



Overview

The intercepting filter design pattern is used when we want to do some pre-processing / post-processing with request or response of the application. Filters are defined and applied on the request before passing the request to actual target application. Filters can do the authentication/ authorization/ logging or tracking of request and then pass the requests to corresponding handlers. Following are the entities of this type of design pattern.

  • Filter - Filter which will performs certain task prior or after execution of request by request handler.

  • Filter Chain - Filter Chain carries multiple filters and help to execute them in defined order on target.

  • Target - Target object is the request handler

  • Filter Manager - Filter Manager manages the filters and Filter Chain.

  • Client - Client is the object who sends request to the Target object.

Implementation

We are going to create a FilterChain,FilterManager, Target, Client as various objects representing our entities.AuthenticationFilter and DebugFilter represent concrete filters.

InterceptingFilterDemo, our demo class, will use Client to demonstrate Intercepting Filter Design Pattern.

Intercepting Filter Pattern UML Diagram

Step 1

Create Filter interface.

Filter.java

package com.tutorialspoint;

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

Step 2

Create concrete filters.

AuthenticationFilter.java

package com.tutorialspoint;

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

DebugFilter.java

package com.tutorialspoint;

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

Step 3

Create Target

Target.java

package com.tutorialspoint;

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

Step 4

Create Filter Chain

FilterChain.java

package com.tutorialspoint;

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;
   }
}

Step 5

Create Filter Manager

FilterManager.java

package com.tutorialspoint;

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);
   }
}

Step 6

Create Client

Client.java

package com.tutorialspoint;

public class Client {
   FilterManager filterManager;

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

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

Example - Usage of Intercepting Filter Pattern

Use the Client to demonstrate Intercepting Filter Design Pattern.

InterceptingFilterPatternDemo.java

package com.tutorialspoint;

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

public class InterceptingFilterPatternDemo {
   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");
   }
}
interface Filter {
   public void execute(String request);
}
class AuthenticationFilter implements Filter {
   public void execute(String request){
      System.out.println("Authenticating request: " + request);
   }
}
class DebugFilter implements Filter {
   public void execute(String request){
      System.out.println("request log: " + request);
   }
}
class Target {
   public void execute(String request){
      System.out.println("Executing request: " + request);
   }
}
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;
   }
}
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);
   }
}
class Client {
   FilterManager filterManager;

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

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

Output

Verify the output.

Authenticating request: HOME
request log: HOME
Executing request: HOME
Advertisements