2016-05-15 14 views
3

Zuulでは、リクエストが特定のサービスに転送される前または後にアクティブ化されるカスタムフィルタを簡単に定義できます。Netflix Zuulブロックリクエストルーティング

リクエストが「プレ」フィルタレベルで転送されるのをブロックし、クライアントにすぐに応答を送信する方法はありますか? "静的な"フィルタで同様のことができることは知っていますが、リクエストごとに(リクエストの中にある特定のパラメータやヘッダーの存在に基づいて)決定する必要があります。

答えて

2

解決策が見つかりました。私の "pre"カスタムフィルタのrun()メソッドにcontext.setSendZuulResponse(false); を追加するだけでした。

他のフィルタは依然として呼び出されますが、リクエストは宛先にルーティングされません。

3

preフィルタを使用してリクエストの認証を確認し、リクエストが許可されていない場合は、401を返し、バックエンドサービスをもう呼び出さないようにします。この要求を停止するには、コンテキストを伝える

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

ctx.unset()、およびctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());ここ401

0

にHTTPコードを設定し、私がチェックしzuulフィルタを使用する方法の例です:私はこのようなrun()機能でそれを行います許可されているAPIキーがある。そうでなければ、クライアントに401応答を送信します。

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

クライアントのAPIキーが許可されていない場合は、他のすべてのフィルタがまだ実行されますが、要求はまだctx.setSendZuulResponse(false)による失敗することに注意してください。 レスポンスに失敗すると、デフォルトで空になります。つまり、Content-Typeなどのヘッダーがありません。クライアントのブラウザなどがレスポンスボディを解析する方法を知っているので、自分で設定することをお勧めします。

関連する問題