社区首页 >问答首页 >Spring Cloud Gateway :如何将params传递给自定义过滤器

Spring Cloud Gateway :如何将params传递给自定义过滤器
EN

Stack Overflow用户
提问于 2018-11-25 07:49:07
回答 1查看 4.7K关注 0票数 5

我在application.yml中定义了一个自定义过滤器。我需要从YAML中的过滤器定义中获取更多参数,以便可以在自定义过滤器中执行逻辑。我定义了多个这样的路由,其中过滤器参数不同。我面临的问题是,无法读取YAML文件中指定的值。

代码语言:javascript
代码运行次数:0
复制
application.yml ---

spring:
  cloud:
    gateway:
      routes:
      - id: test_route
        uri: https://api.rangon.pi
        predicates:
        - Path=/api/staticdata/rattlefeed*
        filters:
        - AddRequestHeader=X-Y-Host, rangon
        - TestGatewayFilter=admin, XY8382, basic

//有没有办法在我的自定义过滤器类中获取"admin,XY8382,basic“

我的过滤器类

代码语言:javascript
代码运行次数:0
复制
@Component
public class TestGatewayFilter implements 
   GatewayFilterFactory<TestGatewayFilter.Config> {

     @Override
     public GatewayFilter apply(Config config) {
         // grab configuration from Config object

         return (exchange, chain) -> {
             Route r = (Route) exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);

             Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
            // ServerWebExchange route =
            // exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
            // List<GatewayFilter> list = r.getFilters();

            GatewayFilter gwf = r.getFilters().get(r.getFilters().size() - 1);

            Builder builder = exchange.getRequest().mutate();
            // use builder to manipulate the request

            return chain.filter(exchange.mutate().build());
        };
    }

    public Config newConfig() {

        Config c = new Config();
        return c;
    }

    public static class Config {
        // Put the configuration properties for your filter here

    }

} 
EN

回答 1

Stack Overflow用户

发布于 2019-04-04 23:19:35

有两种方法可以在配置文件中为过滤器定义参数,在本例中,我将使用application.yml

首先,您可以使用args关键字来定义参数的键值列表:

代码语言:javascript
代码运行次数:0
复制
spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://myapi.com
          filters:
            - name: TestLoggingFilter
              args:
                value: ThisIsATest

第二种形式是使用内联参数:

代码语言:javascript
代码运行次数:0
复制
spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://myapi.com
          filters:
            - TestLoggingFilter=ThisIsATest

如果要使用内联参数,请确保使用包含要接收的参数名称的数组覆盖筛选器中的shortcutFieldOrder方法,此数组还用于定义参数的顺序。

下面是一个简单的筛选器示例,它适用于前面的任何定义,因为此示例还会覆盖shortcutFieldOrder

代码语言:javascript
代码运行次数:0
复制
package com.es.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.List;

@Component
public class TestLoggingFilter implements GatewayFilterFactory<TestLoggingFilter.Config> {

    private static final Logger LOG = LoggerFactory.getLogger(TestLoggingFilter.class);

    private static final String VALUE = "value";

    @Override
    public Config newConfig() {
        return new Config();
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Collections.singletonList(VALUE);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            LOG.info("Filter enabled with value: " + config.value);
            return chain.filter(exchange);
        };
    }

    public static class Config {

        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53465617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文