Interceptáló szűrő programtervezési minta

A Wikipédiából, a szabad enciklopédiából

Az interceptáló szűrő a Java EE egy programtervezési mintája. A minta cserélhető szűrőket hoz létre, hogy beavatkozzon általános szolgáltatásokba, anélkül, hogy a belső működés megváltozna. A szűrők kezelhetik a kéréseket és a válaszokat, előzetes vagy utólagos feldolgozást végezve. A szűrők módosíthatók vagy eltávolíthatók anélkül, hogy a kódon lényegi változtatásokat végeznének.[1] A minta átlátható újrafelhasználható feldolgozást végez azelőtt és azután, hogy a front és a lapvezérlők működésbe lépnének.[2]

Szerkezete[szerkesztés]

Komponensei a szűrőkezelő, szűrőlánc, szűrők és a célpont.

A szűrőkezelő vezérli a szűrési folyamatot, létrehozza a szűrőláncot a szükséges szűrőkkel a megfelelő sorrendben, és kezdeményezi a feldolgozást.[1]

A szűrőlánc független szűrők rendezett együttese.[1]

A szűrők egymástól függetlenül alkalmazhatók a célpontra. Az általuk végzett feldolgozást a szűrőlánc koordinálja.[1]

A célpont a kliens által igényelt erőforrás.[1]

Előnyei és hátrányai[szerkesztés]

A minta alkalmazása a következő előnyökkel és hátrányokkal jár:

  • Újrafelhasználhatóság javítása: A szűrők és a központi egység egymástól függetlenül kezelhetők, cserélhetők, újrafelhasználhatók
  • Rugalmasság növelése: A szűrők és a központ különálló egység[1][2]
  • Hosszú szűrőláncok lelassíthatják a programot, és az áttekinthetőséget is rontják.[2]

Példa kód[szerkesztés]

A példa kód Javában készült. A szűrő általános, feldolgozást nem végez.

A szűrő:

public class DebuggingFilter implements Processor {
  private Processor target;

  public DebuggingFilter(Processor myTarget) {
    target = myTarget;
  }

  public void execute(ServletRequest req, 
  ServletResponse res) throws IOException, 
    ServletException    {
    //Do some filter processing here, such as 
    // displaying request parameters
    target.execute(req, res);
  }
}

[1]

Központi egység:

public class CoreProcessor implements Processor {
  private Processor target;
  public CoreProcessor()   {
    this(null);
  }

  public CoreProcessor(Processor myTarget)   {
    target = myTarget;
  }

  public void execute(ServletRequest req, 
      ServletResponse res) throws IOException, 
      ServletException   {
    //Do core processing here
  }
}

[1]

Kérések feldolgozása:

public void processRequest(ServletRequest req, 
  ServletResponse res) 
  throws IOException, ServletException {
  Processor processors = new DebuggingFilter( 
    new AuthenticationFilter(new CoreProcessor()));
  processors.execute(req, res);

  //Then dispatch to next resource, which is probably 
  // the View to display
  dispatcher.dispatch(req, res);
}

[1]

Szűrőkezelő:

public void processRequest(ServletRequest req, 
  ServletResponse res) 
  throws IOException, ServletException {
  Processor processors = new DebuggingFilter( 
    new AuthenticationFilter(new CoreProcessor()));
  processors.execute(req, res);

  //Then dispatch to next resource, which is probably 
  // the View to display
  dispatcher.dispatch(req, res);
}

[1]

Szűrőlánc:

public class FilterChain {
  // filter chain 
  private List<Filter> myFilters = new ArrayList<>();

  // Creates new FilterChain 
  public FilterChain()  {
    // plug-in default filter services for example 
    // only. This would typically be done in the 
    // FilterManager, but is done here for example 
    // purposes
    myFilters.add(new DebugFilter());
    myFilters.add(new LoginFilter());
    myFilters.add(new AuditFilter());
  }

  public void processFilter( 
    javax.servlet.http.HttpServletRequest request,
    javax.servlet.http.HttpServletResponse response)
  throws javax.servlet.ServletException, 
    java.io.IOException         {
    Filter filter;

    // apply filters
    for (final Filter filter : filters)
    {
      // pass request & response through various 
      // filters
      filter.execute(request, response);
    }
  }
}

[1]

Jegyzetek[szerkesztés]

  1. a b c d e f g h i j k Core J2EE Patterns - Intercepting Filter. Oracle . Oracle. (Hozzáférés: 2016. február 6.)
  2. a b c Kayal, D.. Pro Java EE Spring Patterns. New York: Apress, 98–106. o. (2008) 

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben az Intercepting filter pattern című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.