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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值