通過Zuul,我可以輕鬆定義在請求轉發到特定服務之前或之後激活的自定義過濾器。Netflix Zuul - 塊請求路由
有沒有辦法阻止請求在「預先」過濾級別轉發,並立即發送響應給客戶端? 我知道類似的東西可以用「靜態」過濾器來實現,但是我需要根據請求來決定(基於請求本身中是否存在某些參數/頭文件)。
通過Zuul,我可以輕鬆定義在請求轉發到特定服務之前或之後激活的自定義過濾器。Netflix Zuul - 塊請求路由
有沒有辦法阻止請求在「預先」過濾級別轉發,並立即發送響應給客戶端? 我知道類似的東西可以用「靜態」過濾器來實現,但是我需要根據請求來決定(基於請求本身中是否存在某些參數/頭文件)。
我找到了解決方案,只需要在我的「pre」自定義過濾器的run()方法中添加context.setSendZuulResponse(false);
。
其他過濾器仍將被調用,但請求不會被路由到目標。
我使用pre
過濾器來檢查請求的身份驗證,如果請求沒有授權,則我返回401
並且不再調用後端服務。我這樣做是在run()
功能是這樣的:
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());
設置HTTP代碼401
下面是我如何使用zuul過濾器來檢查例子獲得授權的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
等標題。最好自己設置它們,以便客戶端瀏覽器等知道如何解析響應主體。