在使用zuul網關的時候遇到了一個問題,我的請求頭中的Authorization信息經過zuul之後就被丟失了。按照網上找來的解決辦法,我給網關服務加了一個過濾器:
@Component
public class WebFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
//經過網關的請求會丟失頭信息,所以我們需要一些特殊處理
//先得到request上下文
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String authorization = request.getHeader("Authorization");
if (authorization != null && !authorization.isEmpty()) {
currentContext.addZuulRequestHeader("Authorization", authorization);
}
return null;
}
}
然而,在過濾器中能獲取到Authorization信息,但是在另一個服務中依舊獲取不到。。。坑爹啊。。。
經過不斷的測試我發現了一個有趣的現象,當我給請求頭中的鍵名改成token的時候,另一個服務中就能獲取到這部分信息,甚至我改成Authorization1的話也可以被獲取到。難道是隻有Authorization這個詞會被zuul網關過濾掉?
帶着這個線索,我繼續去網上找答案,果然給我找到了:
敏感頭信息Authorization,Cookie,Set-Cookie默認是不轉發的,所以其他服務中也就獲取不到這部分信息。
解決辦法就是在application.yml文件中添加
zuul.sensitive-header:
冒號後面就空着,這樣一來這些敏感信息就不會被zuul過濾掉了
那麼爲什麼加了這段配置以後,就可以不被過濾掉了呢?
我找到了ZuulProperties類,在這個類中找到了下面這兩段代碼
這麼一看就很明顯了,sensitiveHeaders
集合表示zuul要過濾的請求頭信息,它默認有三個元素Authorization,Cookie,Set-Cookie。當我們在配置文件中設置了zuul.sensitive-header的時候,zuul就會將我們配置的集合代替它默認的集合,所以當我們設置的zuul.sensitive-header:
冒號右邊爲空的時候,它就會用一個空集合代替默認的集合,因此zuul將不會過濾任何請求頭信息。