2017-01-16 3 views
0

In meiner Feder Boot-Anwendung Ich habe folgende Filterregister:Prevent Filterkette von der Ausführung auf Basis der Bedingung

@Bean 
public FilterRegistry filterRegistry(Service1 service1, Service2 service2, 
      EvictionService evictionService) throws GeneralSecurityException { 
     FilterRegistry r = FilterRegistry.instance(); 

     r.put("filter1", new MetadataFilter(Service2,evictionService)); 
     r.put("filter2", new RoutesFilter(service1,evictionService, publicKey)); 

     return r; 
} 

Im ersten Filter I auf einem Zustand überprüfen müssen, wenn diese Bedingung erfüllt ist, ich mag Überspringe alle Filter in meiner Filterregistrierung. Was ich jetzt habe, ist, dass ich den Scheck am Anfang jedes Filters wie folgt tun:

public class Filter1 extends ZuulFilter { 
    public boolean shouldFilter() { 
      if(condition){ 
      return false; 
      } 
      return true 
    } 

} 

public class Filter2 extends ZuulFilter { 
    public boolean shouldFilter() { 
      if(condition){ 
      return false; 
      } 
      return true 
    } 

} 

aber was ich wirklich will, ist einen neuen Filter zu erstellen, der die Bedingung erfüllt ist, führen Sie den Zustand Filter am Anfang Wenn die Bedingung erfüllt ist, fahren Sie nicht mit der Ausführung der Filterregistrierung fort.

irgendwelche Ideen?

Antwort

1

Dies kann logisch erreicht werden, indem ein Anforderungsattribut in Ihrem Entscheidungsfilter hinzugefügt wird.

Der Entscheidungsfilter sollte wie folgt aussehen.

Jetzt holen die Operational Filter nur das entsprechende Attribut aus der Anfrage und führen die Operation aus, wenn true.

public class FilterOne extends ZuulFilter { 
    @Override 
    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     HttpServletRequest request = ctx.getRequest(); 

     if (servletRequest.getAttribute("executeFilter1") != null || ((Boolean) servletRequest.getAttribute("executeFilter1"))) { 
      // Perform your task 
     } 
    } 
} 

Ähnlich können Sie eine beliebige Anzahl von Filtern mit einem Entscheidungsfilter implementieren, der zuerst ausgeführt wird.

+0

das wird definitiv funktionieren, danke für die Antwort. Allerdings suchte ich nach einer Antwort, die den vorhandenen Filtern keine Bedingungen hinzufügt. –

+1

Die Implementierung einer solchen bedingten Ausführung von Filtern ohne Änderung des Codes in Filtern selbst ist nicht möglich, da Daten zur Laufzeit überprüft werden müssen und die Filterregistrierung nicht aktualisiert werden kann Laufzeit. – Avinash

Verwandte Themen