问题:

        不知道你们有没有遇到这样的问题,微服务中,zuul作为网关会去转发请求给另一个业务模块,但是header会丢失。

原因:

        主要是zuul底层有默认过滤,会将(cookie,Set-Cookie,Authorization)等敏感信息忽略掉,所以有些header参数会丢失。

解决:

zuul:
  host:
    connect-timeout-millis: 60000
    socket-timeout-millis: 120000
  retryable: true
  sensitive-headers:
  ignored-headers: Access-Control-Allow-Credentials,Access-Control-Allow-Origin,Vary,X-Frame-Options,token

        1、zuul的yml文件配置中,将sensitive-headers 后配置不让zuul忽略的参数,或者直接为“”,为“”则代表所有的header都不过滤。

        2、ignored-headers: 后面跟的是不忽略response的内容。

        3、服务之间通过client调用时,需要在拦截器中将用到的header参数get一遍,再放到RequestTemplate中去,然后下一层的服务就能获取到header参数了。

@Configuration
public class FeignTokenInterceptor implements RequestInterceptor {


    @Override
    public void apply(RequestTemplate template) {
        HttpServletRequest request = getServletRequest();
        if (null == request){
            return;
        }
        String headers = getHeaders(request);
        template.header(CommonConstants.HEADER_TOKEN_INFO_KEY, getHeaders(request));
        template.header(CommonConstants.HEADER_DEVICE_ID, request.getHeader(CommonConstants.HEADER_DEVICE_ID));
        template.header(CommonConstants.HEADER_DEVICE_TYPE, request.getHeader(CommonConstants.HEADER_DEVICE_TYPE));
        template.header(CommonConstants.HEADER_PLATFORM_ID, request.getHeader(CommonConstants.HEADER_PLATFORM_ID));
    }

    private HttpServletRequest getServletRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }

    private String getHeaders(HttpServletRequest request){
        return request.getHeader(CommonConstants.HEADER_TOKEN_INFO_KEY);
    }


}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐