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将不会过滤任何请求头信息。

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