Spring Cloud全解析:网关之GateWay过滤器

GateWay过滤器

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,只能指定路由进行使用,由GatewayFilter的工厂类来产生,Gateway官方提供了很多的路由过滤器,也可以实现自己的自定义过滤器

内置过滤器

请求头/响应头过滤器
  • AddRequestHeaderGatewayFilterFactory

  • AddResponseHeaderGatewayFilterFactory

  • DedupeResponseHeaderGatewayFilterFactory 处理重复响应头

    有三种策略 RETAIN_FIRST、RETAIN_LAST、RETAIN_UNIQUE

    yml 复制代码
    spring:
    	cloud:
    		gateway:
    			default-filters:
          	- DedupeResponseHeader=Access-Control-Allow-Credentials, RETAIN_LAST #规则写在最后
  • PreserveHostHeaderGatewayFilterFactory

  • RemoveRequestHeaderGatewayFilterFactory

  • RemoveResponseHeaderGatewayFilterFactory

  • RequestHeaderSizeGatewayFilterFactory

  • SecureHeadersGatewayFilterFactory

  • SetRequestHeaderGatewayFilterFactory

  • SetResponseHeaderGatewayFilterFactory

请求参数过滤器
  • AddRequestParameterGatewayFilterFactory

    yml 复制代码
    spring:
    	cloud:
    		gateway:
    			default-filters:
          	- AddRequestHeader=X-Request-red, blue
  • RemoveRequestParameterGatewayFilterFactory

路径过滤器
  • PrefixPathGatewayFilterFactory 为匹配的url添加指定前缀

    yml 复制代码
    spring:
    	cloud:
    		gateway:
    			default-filters:
          	- PrefixPath=/mypath # 增加指定前缀,如/hello变成/mypath/hello
  • RewritePathGatewayFilterFactory 采用正则表达式替换参数

    yml 复制代码
    spring:
    	cloud:
    		gateway:
    			default-filters:
          	- RewritePath=/red/?(?<segment>.*), /$\{segment} # 两个参数,一个是请求路径的正则表达式,一个是替换的路径参数,如/red/blue会变成/blue
  • SetPathGatewayFilterFactory

  • StripPrefixGatewayFilterFactory 在将请求发送到下游之前从请求中剥离的路径个数

    yml 复制代码
    spring:
    	cloud:
    		gateway:
    			default-filters:
          	- StripPrefix=2 # 如/mypath/red/blue会变成/blue
请求体/响应体过滤器
  • RequestSizeGatewayFilterFactory
响应状态过滤器
  • SetStatusGatewayFilterFactory

    yml 复制代码
    spring:
    	cloud:
    		gateway:
    			default-filters:
          	- SetStatus=401
会话过滤器
  • SaveSessionGatewayFilterFactory
重定向过滤器
  • RedirectToGatewayFilterFactory
重试过滤器
  • RetryGatewayFilterFactory
限流过滤器
  • RequestRateLimiterGatewayFilterFactory

自定义

自定义全局过滤器

实现自定义的全局过滤器,需要实现GlobalFilter和Ordered接口,全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,为请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上

java 复制代码
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("过滤器进入");
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        if(StringUtils.isBlank(token)){
            System.out.println("不包含token");
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        // 继续执行过滤器链
        return chain.filter(exchange);
    }

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

全局过滤器不需要在配置文件中配置

自定义网关过滤器
实现GatewayFilter方式

需要实现GatewayFilter和Ordered接口

java 复制代码
@Component
public class MyCustomFilter implements GatewayFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("自定义过滤器进入");
        // 继续执行过滤器链
        return chain.filter(exchange);
    }

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

需要使用java编码来配置自定义过滤器

java 复制代码
@Configuration
public class MyConfig {
    /**配置自定义过滤器*/
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes().route(r ->
                        r.path("/provider/**")//用户访问的路径
                                .uri("lb://service-provider")//路由的真实服务器ip+端口
                                .filters(new MyCustomFilter()) // 局部过滤器
                                .id("provider_route")) // 路由id
                .build();
    }
}

使用GatewayFilter还需要硬编码,不太好用,那么有没有更方便的方式呢?

继承AbstractGatewayFilterFactory
java 复制代码
public class MyCustomGatewayFilterFactory extends AbstractGatewayFilterFactory<MyCustomGatewayFilterFactory.Config> {
 
    public MyCustomGatewayFilterFactory() {
        super(Config.class);
    }
 
    @Override
    public GatewayFilter apply(Config config, Class<Config> configClass) {
        // 在这里创建并返回过滤器实例
        return (exchange, chain) -> {
            // 过滤器逻辑
            return chain.filter(exchange);
        };
    }
 
    public static class Config {
        // 过滤器的配置参数
    }
}

配置

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: my
          uri: http://example.com
          filters:
            - MyCustom=1
          predicates:
            - Path=/api/**

https://zhhll.icu/2021/框架/微服务/springcloud/网关/GateWay/3.GateWay过滤器/

相关推荐
来一杯龙舌兰3 分钟前
【JAVA】自动生成常量类、自动生成所需代码(附源码)
java·开发语言·c#·自动生成代码
Flying_Fish_roe8 分钟前
Spring Boot-依赖冲突问题
java·linux·spring boot
月临水13 分钟前
JavaEE:网络编程(套接字)
java·网络·java-ee
国通快递驿站14 分钟前
AntFlow系列教程二之流程同意
java·开发语言
宏基骑士37 分钟前
【java面向对象二】static(一)
java·开发语言
IT学长编程39 分钟前
计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·网上蛋糕销售系统
尘浮生1 小时前
Java项目实战II基于Java+Spring Boot+MySQL的服装厂服装生产管理系统的设计与实现
java·开发语言·spring boot·后端·mysql·maven·intellij-idea
箬敏伊儿1 小时前
打包好的jar包,如何部署在服务器?——详细教程
java·服务器·python·jar
项目笔记与工具库1 小时前
Java并发工具类详解:CountDownLatch与CyclicBarrier
java·开发语言·python
技术无疆2 小时前
ButterKnife:Android视图绑定的简化专家
android·java·android studio·android-studio·androidx·butterknife·视图绑定