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