2016-05-15 7 views
3

Mit Zuul kann ich leicht benutzerdefinierte Filter definieren, die aktiviert werden, bevor oder nachdem die Anfrage an den bestimmten Dienst weitergeleitet wird.Netflix Zuul - Block Anfrage Routing

Gibt es eine Möglichkeit, die Weiterleitung von Anfragen auf einer "Pre" -Filterebene zu blockieren und sofort die Antwort an den Client zu senden? Ich weiß, dass etwas Ähnliches mit "statischen" Filtern machbar ist, aber ich muss mich pro Anfrage entscheiden (basierend auf dem Vorhandensein bestimmter Parameter/Header in der Anfrage selbst).

Antwort

2

Ich fand die Lösung, nur context.setSendZuulResponse(false); in der run() -Methode meiner "Pre" benutzerdefinierte Filter hinzufügen.

Andere Filter werden weiterhin aufgerufen, aber die Anforderung wird nicht zum Ziel weitergeleitet.

3

Ich verwende einen pre Filter, um die Authentifizierung der Anfrage zu überprüfen, und wenn die Anfrage nicht autorisiert ist, dann gebe ich 401 zurück und rufe den Backend-Service nicht mehr an. Ich mache es in run() Funktion wie folgt aus:

RequestContext ctx = getCurrentContext(); 
    // do something to check the authentication 
    if(auth failed){ 
     ctx.unset(); 
     ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); 
    } 

ctx.unset() den Kontext sagen, diese Anforderung zu stoppen, und ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); stellen Sie den http-Code 401

0

Hier ist ein Beispiel dafür, wie ich zuul-Filter überprüfen für einen API-Schlüssel, der autorisiert wird. Wenn nicht, sende ich eine Antwort an den Client.

@Override 
    public Object run() { 

     RequestContext ctx = RequestContext.getCurrentContext(); 
     HttpServletRequest request = ctx.getRequest(); 

     String apiKey = request.getHeader("X-API-KEY"); 
     if (!isAuthorized(apiKey)){ 
      // blocks the request 
      ctx.setSendZuulResponse(false); 

      // response to client 
      ctx.setResponseBody("API key not authorized"); 
      ctx.getResponse().setHeader("Content-Type", "text/plain;charset=UTF-8"); 
      ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); 
     } 

     return null; 
    } 

Beachten Sie, dass, wenn die API-Schlüssel des Clients nicht autorisiert, alle anderen Filter wird noch ausgeführt werden, aber die Anforderung wird immer noch wegen ctx.setSendZuulResponse(false) scheitern. Wenn eine Antwort fehlschlägt, ist sie standardmäßig leer - das heißt, es gibt keine Überschriften wie Content-Type usw. Es ist eine gute Idee, sie selbst zu setzen, damit der Browser eines Clients den Antworttext analysieren kann.

Verwandte Themen