(Zuul请求头问题)Spring Cloud系列之客户端请求带“Authorization”请求头,经过zuul转发后丢失了
zuul默认走的过滤器如下图:
在决定调用哪个路由的时候会执行PreDecorationFilter的时候:
必定会走getSensitiveHeaders()方法,从ZuulProperties这个全局属性类中设置的拿出SensitiveHeaders,具体如下图。
PreDecorationFilter决定使用哪一个route,它的结果的是放在RequestContext对象中,该对象中含有的ignoredHeaders()中的authorization、set-cookie、cookie三个忽视请求头也就带到后续会执行的route的过滤器中,后续执行的过滤器都会RequestContext context = RequestContext.getCurrentContext()也就获取到了这三个忽视头。
在pom.xml文件中加入
zuul:
sensitive-headers:
可以去除PreDecorationFilter过滤器自带的三个忽视头(authorization、set-cookie、cookie)。具体参考8. Router and Filter: Zuul
具体执行哪个route过滤器依据路由格式来定。
1.对于serviceId格式的路由,走RibbonRoutingFilter
负责根据ServiceId来路由的RibbonRoutingFilter在route之前会调用ProxyRequestHelper的buildZuulRequestHeaders(request)来重新组装一个新的Header,RibbonRoutingFilter默认过滤来自PreDecorationFilter传递的三个忽视头(authorization、set-cookie、cookie)和其自带的host、connection、content-length、content-encoding、server、transfer-encoding、x-application-context等请求头。
RibbonRoutingFilter代码:
本次我们主要关注buildZuulRequestHeaders这个方法
里面有个isIncludedHeader(name)
2.对于URL格式和域名格式的路由(用来转发不走consul的proxy,里头是使用httpclient来转发请求的),走SimpleHostRoutingFilter(会有两个重名的类,选择Spring版本高的那个)
对于请求头,逻辑和RibbonRoutingFilter一样。