【问题标题】:Spring Cloud Zuul: Apply filter only to specific routeSpring Cloud Zuul:仅将过滤器应用于特定路由
【发布时间】:2017-09-03 06:09:13
【问题描述】:

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

我已经成功地为每个应用适当标头的标记编写了一个简单的预过滤器。但是,我现在有一个问题。即使在翻阅文档之后,我也无法弄清楚如何使每个过滤器仅适用于正确的路线。我不想在 url 跨环境更改时执行 url 匹配。理想情况下,我有办法在过滤器中获取路线的名称。

我的应用程序.yml:

zuul:
  routes:
    foo:
      path: /foo/**
      url: https://fooserver.com
    bar:
      path: /bar/**
      url: https://barserver.com

理想情况下,我想在 FooFilter.java(预过滤器)中做这样的事情:

public bool shouldFilter() {
    return RequestContext.getCurrentContext().getRouteName().equals("foo");
}

但我似乎找不到任何方法来做到这一点。

【问题讨论】:

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


    【解决方案1】:

    您可以使用RequestContext 中的proxy 标头来区分路由服务器,如下所示。如果您使用的是功能区,也可以使用 serviceId 标头。但是,如果您像上面的示例一样指定 url 直接,您应该使用 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;
    }
    

    【讨论】:

    • 哇,我不敢相信这是多么难找到!谢谢!
    • 次要评论:如果可以简化为 "foo".equals( ctx.get( "proxy" )
    • 在哪里可以找到过滤器中给出的订单号的详细信息?
    • @BalajiSrinivasan 你可以在这里找到订单 - FileConstants.java github.com/spring-cloud/spring-cloud-netflix/blob/master/…
    • 我正在使用 Spring Boot 2.2.6.RELEASE,不幸的是它不起作用,没有与 RequestContext 关联的“代理”对象。还有其他想法吗?
    猜你喜欢
    • 2016-05-27
    • 2017-06-17
    • 2023-03-04
    • 2016-07-11
    • 2020-04-15
    • 2018-08-23
    • 2018-08-06
    • 2016-08-31
    • 2017-12-02
    相关资源
    最近更新 更多