Spring Cloud Zuul: применить фильтр только к определенному маршруту

Я использую Zuul Spring Cloud для передачи некоторых запросов 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");
}

но я не могу найти способ сделать это.


person Xcelled    schedule 07.04.2017    source источник


Ответы (1)


Вы можете использовать заголовок proxy в RequestContext, чтобы различать маршрутизируемый сервер, как показано ниже. Если вы используете ленту, вы также можете использовать заголовок 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;
}
person yongsung.yoon    schedule 09.04.2017
comment
Ничего себе, я не могу поверить, как трудно это было найти! Спасибо! - person Xcelled; 10.04.2017
comment
Небольшой комментарий: if можно упростить с помощью foo.equals(ctx.get(proxy) - person Martin Dürrmeier; 13.11.2017
comment
Где я могу найти информацию о номере заказа, указанном в фильтре? - person balaaagi; 02.01.2018
comment
@BalajiSrinivasan Вы можете найти порядок здесь - FileConstants.java github.com/spring-cloud/spring-cloud-netflix/blob/master/ - person yongsung.yoon; 04.01.2018
comment
Я использую Spring Boot 2.2.6.RELEASE, и, к сожалению, он не работает, нет прокси-объекта, связанного с RequestContext. Любая другая идея? - person Istvan Kiss; 17.06.2020