网关入门(三)认识网关自定义过滤器

136 阅读1分钟
网关登录校验

image.png

网关过滤器种类

image.png

image.png

自定义过滤器

image.png

自定义过滤器文件目录

image.png

GatewayFilter自定义过滤器

1、导入依赖

<!--网管依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--loadbalancer负载均衡器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2、创建filter

package com.hmall.gateway.filters;

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

import java.util.List;
@Component
public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<PrintAnyGatewayFilterFactory.Config> {

    @Override
    public GatewayFilter apply(Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                System.out.println("PrintAnyGatewayFilterFactory 过滤:" + exchange.getRequest().getLocalAddress());
                System.out.println("a:"+config.getC());
                return chain.filter(exchange);
            }
        };
    }
    // 自定义配置属性,成员变量名称很重要,下面会用到
    // TODO 注意static
    @Data
    public static class Config{
        private String a;
        private String b;
        private String c;
    }
    // 将变量名称依次返回,顺序很重要,将来读取参数时需要按顺序获取
    @Override
    public List<String>shortcutFieldOrder(){
        return List.of("a","b","c");
    }
    // 返回当前配置类的类型,也就是内部的Config
    @Override
    public Class<Config>getConfigClass(){
        return Config.class;
    }
}

3、配置yaml文件

server:
  port: 10086
spring:
  application:
    name: hm-gateway
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: 114.116.45.207:8848
    gateway:
      routes:
        - id: item-service
          uri: lb://item-service
          predicates:
            - Path=/items/**,/search/**
          filters:
            - AddRequestHeader=truth, weiwei
            - Custom= WOW, true, true
            - PrintAny= aa, bb, cc

GlobalFilter自定义过滤器

image.png

filter代码

package com.hmall.gateway.filters;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class PrintAnyGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("全局过滤器执行。。。");
        return chain.filter(exchange);
    }
    // 标记权重、权重越小越优先
    @Override
    public int getOrder() {
        return 0;
    }
}