SpringCloudGateway学习(2)-过滤器

1.简介

 Gateway 作用:过滤器就是在请求的传递过程中,对请求和响应做一些手脚。

 Gateway 生命周期:Pre Post。

  • PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
  • POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

Gateway 分类:局部过滤器全局过滤器

  • 局部过滤器(GatewayFilter):应用到单个路由或者一个分组的路由上。
  • 全局过滤器(GlobalFilter):应用到所有的路由上。

2. 配置方式

   过滤器的配置分为两种方式,一种是通过配置文件的方式,一种是通过编码的方式。

2.1 配置文件方式

#这种是局部过滤器配置
spring:
  cloud:
    gateway:
      routes:
      - id: resource
        uri: http://localhost:9000
        predicates:
        - Path=/resource
        filters:
        - TokenRelay=



#这种是全局过滤器配置,只需要设置default-filters就可以了

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Red, Default-Blue
      - PrefixPath=/httpbin

2.2编码方式

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("resource", r -> r.path("/resource")
                    .filters(f -> f.tokenRelay())
                    .uri("http://localhost:9000"))
            .build();
}

3. 过滤器分类

 3.1 局部过滤器(GatewayFilter)

    局部过滤器(GatewayFilter)是针对单个路由的过滤器,对访问的URL过滤,切面处理。在Spring Cloud Gateway中通过GatewayFilter的形式内置了很多不同类型的局部过滤器。内置了31种过滤器。

序号过滤器作用参数名参数值示例(filters配置)备注
1AddRequestHeader添加请求头name,value添加的请求头及其值AddRequestHeader=X-Request-red, blue
2AddRequestParameter在Query String中添加请求参数,参数值可以是变量,具体值可以从PATH或Host中匹配name,value添加的参数名及其值AddRequestParameter=foo, bar-{segment}
3AddResponseHeader添加响应头name,value添加的响应头及其值AddResponseHeader=X-Response-Red, Blue
4DedupeResponseHeader过滤重复响应头name,strategy需要过滤的响应头及策略(保留第一个,保留最后一个,保留唯一值)DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
5CircuitBreaker熔断器name,fallbackUri,statusCodes熔断器名称、熔断后的默认URI、熔断触发状态#NAME?使用熔断器需配置spring-cloud-starter-circuitbreaker-reactor-resilience4j,详见Resilience4J Documentation
6FallbackHeaders指定发生熔断时fallback响应头executionExceptionTypeHeaderName, executionExceptionMessageHeaderName, rootCauseExceptionTypeHeaderName, rootCauseExceptionMessageHeaderName异常类型、详情、根因类型、根因详情等响应头名称executionExceptionTypeHeaderName: Test-Header
7MapRequestHeader添加新的请求头,值从已有请求头中获取fromHeader,toHeader已有请求头名称,新请求头名称MapRequestHeader=Blue, X-Request-Red
8PrefixPath请求路径增加前缀prefix需增加的前缀PrefixPath=/mypath
9PreserveHostHeader配置是否将原始请求头发送到服务方--PreserveHostHeader
10RequestRateLimiter请求频度控制--默认提供了基于Redis的频度控制过滤器,也可以自定义
11RedirectTo重定向过滤器status,url重定向http status及重定向后的urlRedirectTo=302, https://acme.org
12RemoveRequestHeader删除请求头name待删除的请求头RemoveRequestHeader=X-Request-Foo
13RemoveResponseHeader删除响应头name待删除的响应头RemoveResponseHeader=X-Response-Foo
14RemoveRequestParameter删除请求参数name待删除的请求参数名RemoveRequestParameter=red
15RewritePath重写PATHregexp,replacement重写部分匹配规则,需替换的值RewritePath=/red/?(?<segment>.*), /$\{segment}匹配规则采用正则表达式,替换值支持从匹配中获取
16RewriteLocationResponseHeader重写响应头中的LocationstripVersionMode, locationHeaderName, hostValue, protocolsRegexpath中version处理模式,location响应头名称,host值,url协议头RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
17RewriteResponseHeader重写响应头name,regexp,replacement响应头名称,需修改值的匹配规则,需替换的值RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
18SaveSession强制触发WebSession::save--SaveSession
19SecureHeaders添加一组安全相关的头信息到响应中--SecureHeaders
20SetPath设置请求pathtemplatepath模板SetPath=/{segment}
21SetRequestHeader设置请求头(不添加新的)name,value请求头及其值SetRequestHeader=X-Request-Red, Blue
22SetResponseHeader设置响应头(不添加新的)name,value响应头及其值SetResponseHeader=X-Response-Red, Blue
23SetStatus设置响应状态status响应状态SetStatus=401
24StripPrefix截断请求PATHparts需截断的长度(’/'个数)StripPrefix=2
25Retry重试过滤器---详细配置
26RequestSize限流器maxSize请求最大报文大小maxSize: 5000000
27SetRequestHostHeader设置请求hosthost分组及权重SetRequestHostHeader=example.org
28ModifyRequestBody修改请求报文---只能通过 Java DSL 配置
29ModifyResponseBody修改响应报文---只能通过 Java DSL 配置
30TokenRelay配合OAuth2使用--TokenRelay=
31CacheRequestBody根据权重进行路由bodyClass请求体类型-详细配置

3.2 全局过滤器(GlobalFilter) 

    全局过滤器作用于所有路由,无需配置。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。

        

 4.自定义过滤器

 4.1 自定义全局过滤器(GlobalFilter)

        a.前置过滤器

@Component
public class MyCustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("this is custom pre filter");
        return chain.filter(exchange).then();
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

b.后置过滤器

@Component
public class MyCustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            System.out.println("this is post filter");
        }));
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

4.2 自定义局部过滤器

  局部过滤器实现需要继承AbstractGatewayFilterFactory类,并且实现apply方法

import lombok.Data;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
public class MyCustomLocalFiterFactory extends AbstractGatewayFilterFactory<MyCustomLocalFiterFactory.ParamsConfig> {
    @Override
    public String name() {
        return "mycustomlocalfiter";
    }

    public MyCustomLocalFiterFactory() {
        super(ParamsConfig.class);
    }

    @Override
    public GatewayFilter apply(ParamsConfig config) {
        return (exchange, chain) -> {
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                System.out.println("name=" + config.getParamName() + ";value=" + config.getParamValue());
            }));
        };
    }


    @Data
    public static class ParamsConfig {
        private String paramName;

        private String paramValue;

    }
}

然后还需配置过滤器到路由上

spring:
  cloud:
    gateway:
      routes: #1路由
        - id: producer-one
          uri: lb://producter-one
          predicates: #2通过path断言
            - Path=/*/producterone/**
          filters: #3过滤器,过滤器可以不用配置
            - StripPrefix=1
            - name: mycustomlocalfiter
              args:
                paramname: "this is paramName"
                paramvalue: "this is paramValue"
        - id: producer-two
          uri: http://localhost:8080
          predicates:
            - Path=/*/productertwo/
          filters:
            - StripPrefix=1

 

参考:

Gateway过滤器详解_wh柒八九的博客-CSDN博客_gateway 过滤器

 Spring Cloud Gateway配置详解-过滤器_EngineZhang的博客-CSDN博客

gateway自定义过滤器_小菜鸡9527的博客-CSDN博客_gateway自定义过滤器

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想禁用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、付费专栏及课程。

余额充值