Spring Cloud Zuul:仅对特定路径应用过滤器

Xce*_*led 7 java spring spring-cloud netflix-zuul spring-cloud-netflix

我正在使用Spring Cloud的Zuul将一些API请求代理到一些外部服务器.代理本身运行良好,但每个服务都需要请求头中提供的(不同)令牌.

我已成功为每个应用适当标头的令牌编写了一个简单的预过滤器.但是,我现在有一个问题.即使在完成文档后,我也无法弄清楚如何使每个过滤器仅适用于正确的路径.我不想在网址随环境变化时执行网址匹配.理想情况下,我有一些方法可以在过滤器中获取路径的名称.

我的application.yml:

zuul:
  routes:
    foo:
      path: /foo/**
      url: https://fooserver.com
    bar:
      path: /bar/**
      url: https://barserver.com
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想在FooFilter.java(预过滤器)中执行类似的操作:

public bool shouldFilter() {
    return RequestContext.getCurrentContext().getRouteName().equals("foo");
}
Run Code Online (Sandbox Code Playgroud)

但我似乎无法找到任何方法来做到这一点.

yon*_*oon 17

您可以使用proxy标头来RequestContext区分路由服务器,如下所示.如果您使用功能区,则还可以使用serviceId标题.但是,如果您在示例上方指定了url direclty,则应使用proxy标头.您必须知道的一件事proxy是设置了标头PreDecorationFilter,因此您的预过滤器必须具有比具有的值更大的过滤器顺序值PreDecorationFilter(此时它是5).

@Override
public int filterOrder() {
    return 10;
}

@Override
public boolean shouldFilter() {
    RequestContext ctx = RequestContext.getCurrentContext();

    if ((ctx.get("proxy") != null) && ctx.get("proxy").equals("foo")) {
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 次要评论:如果可以用"foo".equals(ctx.get("proxy")简化 (4认同)
  • 哇,我简直不敢相信这是多么难找到!谢谢! (2认同)