Zuulでは、リクエストが特定のサービスに転送される前または後にアクティブ化されるカスタムフィルタを簡単に定義できます。Netflix Zuulブロックリクエストルーティング
リクエストが「プレ」フィルタレベルで転送されるのをブロックし、クライアントにすぐに応答を送信する方法はありますか? "静的な"フィルタで同様のことができることは知っていますが、リクエストごとに(リクエストの中にある特定のパラメータやヘッダーの存在に基づいて)決定する必要があります。
Zuulでは、リクエストが特定のサービスに転送される前または後にアクティブ化されるカスタムフィルタを簡単に定義できます。Netflix Zuulブロックリクエストルーティング
リクエストが「プレ」フィルタレベルで転送されるのをブロックし、クライアントにすぐに応答を送信する方法はありますか? "静的な"フィルタで同様のことができることは知っていますが、リクエストごとに(リクエストの中にある特定のパラメータやヘッダーの存在に基づいて)決定する必要があります。
解決策が見つかりました。私の "pre"カスタムフィルタのrun()メソッドにcontext.setSendZuulResponse(false);
を追加するだけでした。
他のフィルタは依然として呼び出されますが、リクエストは宛先にルーティングされません。
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
に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
などのヘッダーがありません。クライアントのブラウザなどがレスポンスボディを解析する方法を知っているので、自分で設定することをお勧めします。