Zuul網關導致請求頭信息丟失的解決辦法

在使用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將不會過濾任何請求頭信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章