重定向时将标题添加到Zuul

时间:2018-04-26 10:29:48

标签: java spring-boot spring-cloud netflix-zuul

我正在尝试使用Zuul将调用重定向到其他地方的下游系统。 在重定向中,我需要在Header中添加必要的数据,以便api接收重定向进行处理。我似乎无法让下游系统检测到这些数据。附上是我的代码。 我使用Zuul

中的Edgware.SR3, Spring Boot 1.5.12

Zuul过滤器

@Component
public class RouteFilter extends ZuulFilter{

@Override
public Object run() {
//Testing to add header
    context.getRequest().getParameterMap().put("api", new String[]{"api"});
    context.getResponse().setHeader("api", api);
    context.addZuulResponseHeader("api", "api");
    context.addZuulRequestHeader("api", "api");
    context.setSendZuulResponse(false);
    context.put(FORWARD_TO_KEY, redirect_urls.get(key));
    context.setResponseStatusCode(HttpStatus.SC_TEMPORARY_REDIRECT);
    context.getResponse().sendRedirect(redirect_urls.get(key));
    return null;
}
}

重定向服务代码

@RequestMapping(value = "/forward")
public ResponseEntity<String> forwardToMe(@RequestHeader(required = true, name = "api")String api){
    return new ResponseEntity<String>("Hi",HttpStatus.OK);
}

邮递员收到错误

  

{       &#34;时间戳&#34;:1524737817729,       &#34;状态&#34;:400,       &#34;错误&#34;:&#34;错误请求&#34;,       &#34; exception&#34;:&#34; org.springframework.web.bind.ServletRequestBindingException&#34;,       &#34;消息&#34;:&#34;缺少请求标题&#39; api&#39;对于String&#34;类型的方法参数,       &#34;路径&#34;:&#34; / forward&#34; }

4 个答案:

答案 0 :(得分:3)

我的回复有点晚了,但是效果很好
如官方文档Cookies and Sensitive Headers
所述 sensitiveHeaders是黑名单,默认值不为空。因此,to make Zuul send all headers (except the ignored ones), you must explicitly set it to the empty list如果您要将Cookie或授权标头传递到后端,则必须这样做。以下示例显示了如何使用sensitiveHeaders:

zuul:
  routes:
    entry:
      path: /users/**
      strip-prefix: false
      service-id: users-service
      sensitive-headers:
      - Cookie,Set-Cookie

已实施的example也可以为您提供帮助

答案 1 :(得分:1)

我猜您使用路由过滤器,也许您可​​以尝试使用预过滤器

添加自定义标头可以通过以下方式完成:context.addZuulRequestHeader("Authorization", "Basic " + credentials);

对于重定向部分,您可以查看此thread

答案 2 :(得分:0)

我在这里更新我的评论,以防万一有人仍然面临此问题。 我最近发现了这个问题,并通过在我的application.yml

中添加以下配置来解决

application.yml ... zuul: sensitive-headers: - Cookie,Set-Cookie ...

下面的参考链接:
https://cloud.spring.io/spring-cloud-static/Dalston.SR5/multi/multi__router_and_filter_zuul.html

答案 3 :(得分:0)

如果有人仍然面临这个问题,

在 Zuul Proxy 中将标头添加到 RequestContext 中,如下所示:

RequestContext ctx = RequestContext.getCurrentContext();
ctx.addZuulRequestHeader("param", "value");

然后在各自的微服务中编写一个自定义过滤器并提取如下值

@Component
public class MyFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                HttpServletResponse response,
                                FilterChain filterChain)
                                throws ServletException, IOException {

        String headerParam  =   request.getHeaders("param").nextElement();
    
        logger.info("headerParam: "+headerParam);
    
        filterChain.doFilter(request, response);
    }

}