Spring.cloud.gateway default-filters

41 篇文章 0 订阅
20 篇文章 0 订阅

本文主要研究下spring.cloud.gateway.default-filters

配置

    {
      "sourceType": "org.springframework.cloud.gateway.config.GatewayProperties",
      "name": "spring.cloud.gateway.default-filters",
      "description": "List of filter definitions that are applied to every route.",
      "type": "java.util.List<org.springframework.cloud.gateway.filter.FilterDefinition>"
    }

default-filters,配置的是FilterDefinition对象

FilterDefinition

spring-cloud-gateway-core-2.0.0.RC1-sources.jar!/org/springframework/cloud/gateway/filter/FilterDefinition.java

@Validated
public class FilterDefinition {
    @NotNull
    private String name;
    private Map<String, String> args = new LinkedHashMap<>();

    public FilterDefinition() {
    }

    public FilterDefinition(String text) {
        int eqIdx = text.indexOf("=");
        if (eqIdx <= 0) {
            setName(text);
            return;
        }
        setName(text.substring(0, eqIdx));

        String[] args = tokenizeToStringArray(text.substring(eqIdx+1), ",");

        for (int i=0; i < args.length; i++) {
            this.args.put(NameUtils.generateName(i), args[i]);
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Map<String, String> getArgs() {
        return args;
    }

    public void setArgs(Map<String, String> args) {
        this.args = args;
    }

    public void addArg(String key, String value) {
        this.args.put(key, value);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        FilterDefinition that = (FilterDefinition) o;
        return Objects.equals(name, that.name) &&
                Objects.equals(args, that.args);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, args);
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("FilterDefinition{");
        sb.append("name='").append(name).append('\'');
        sb.append(", args=").append(args);
        sb.append('}');
        return sb.toString();
    }
}

从这里可以看到default-filter配置的格式,首先用=分割,取出filter的名称,然后=右边是该filter的参数

实例

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Name, Default-Value
      - AddRequestHeader=X-Request-Name, Value
      - AddRequestParameter=name, value

这里配置了AddResponseHeaderFilter,其参数为X-Response-Default-Name, Default-Value,这里就是header名称和值。

AbstractNameValueGatewayFilterFactory

spring-cloud-gateway-core-2.0.0.RC1-sources.jar!/org/springframework/cloud/gateway/filter/factory/AbstractNameValueGatewayFilterFactory.java

public abstract class AbstractNameValueGatewayFilterFactory extends AbstractGatewayFilterFactory<AbstractNameValueGatewayFilterFactory.NameValueConfig> {

    public AbstractNameValueGatewayFilterFactory() {
        super(NameValueConfig.class);
    }

    public List<String> shortcutFieldOrder() {
        return Arrays.asList(GatewayFilter.NAME_KEY, GatewayFilter.VALUE_KEY);
    }


    @Validated
    public static class NameValueConfig {
        @NotEmpty
        protected String name;
        @NotEmpty
        protected String value;

        public String getName() {
            return name;
        }

        public NameValueConfig setName(String name) {
            this.name = name;
            return this;
        }

        public String getValue() {
            return value;
        }

        public NameValueConfig setValue(String value) {
            this.value = value;
            return this;
        }

        @Override
        public String toString() {
            return new ToStringCreator(this)
                    .append("name", name)
                    .append("value", value)
                    .toString();
        }
    }
}

它的子类有

  • AddRequestHeaderGatewayFilterFactory
  • AddRequestParameterGatewayFilterFactory
  • AddResponseHeaderGatewayFilterFactory
  • SetRequestHeaderGatewayFilterFactory
  • SetResponseHeaderGatewayFilterFactory

小结

spring.cloud.gateway.default-filters提供了全局的默认过滤器,其配置采用=来分割过滤器的名称及其参数,参数的话,如果是k-v格式的,采用的是NameValueConfig。

doc



作者:go4it
链接:https://www.jianshu.com/p/bb750724865f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

如果你想禁用Spring Cloud Gateway中的Swagger资源,可以在Gateway中添加一个过滤器来实现。 首先,在你的Gateway应用程序中,你需要创建一个过滤器类。这个过滤器将使用Spring Cloud Gateway中的RouteLocator来查找Swagger资源,然后将它们过滤掉。下面是一个示例过滤器类: ```java @Component public class SwaggerResourceFilter implements GlobalFilter, Ordered { @Autowired private RouteLocator routeLocator; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String requestPath = request.getPath().toString(); // 获取所有的路由 List<Route> routes = routeLocator.getRoutes().collectList().block(); // 遍历路由,查找是否包含Swagger资源 for (Route route : routes) { String routePath = route.getUri().toString(); if (requestPath.startsWith(routePath) && route.getMetadata().containsKey("swagger")) { // 如果请求路径包含Swagger资源,直接返回 return Mono.empty(); } } // 如果请求路径不包含Swagger资源,继续执行过滤器链 return chain.filter(exchange); } @Override public int getOrder() { return -1; } } ``` 在这个过滤器类中,我们首先使用RouteLocator获取所有的路由,然后遍历这些路由,查找是否包含Swagger资源。如果请求路径包含Swagger资源,直接返回,否则继续执行过滤器链。 接下来,在你的Gateway配置文件中,添加以下代码来注册这个过滤器类: ```yaml spring: cloud: gateway: default-filters: - SwaggerResourceFilter ``` 这将会在Gateway启动时自动注册这个过滤器类。当你访问Swagger资源时,Gateway将会过滤掉这些资源,从而禁用它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值