springgateway自定义过滤器

自定义过滤器分两种

全局过滤器:实现globalFilter和order接口就行

局部过滤器:实现AbstractGatewayFilterFactory接口并自定义或者使用父类的Config类  然后还要在配置文件中将过滤器进行配置(指明哪种路由用到自定义过滤器)

全局过滤器EG:

 

复制代码
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;


@Component
public class GatawayGlobalAuthCheckFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("所有服务进来都要先验证");
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        String token = request.getQueryParams().getFirst("token");
        if ("".equalsIgnoreCase(token)) {
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
        } else {
            //这里做业务验证成功
            return chain.filter(exchange);
        }
        return exchange.getResponse().setComplete();
    }

    //过滤器的顺序 从小到大 执行顺序
    @Override
    public int getOrder() {
        return 0;
    }
}
复制代码

局部过滤器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package com.zg.filter;
 
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
 
import java.util.ArrayList;
import java.util.List;
 
 
//自定义过滤器 要在yml文件里配置自定义过滤器的过滤器名称MyCustom (MyCustom-GatewayFilterFactory)
// (GatewayFilterFactory是默认名称,前面的就是自定义过滤器的名称)
//  filters:
//    - MyCustomFilter=condition1,condition2,condition3,condition4
@Order(1)
@Component
public class MyCustomGatewayFilterFactory
        extends AbstractGatewayFilterFactory<MyCustomGatewayFilterFactory.Config> {
 
    public MyCustomGatewayFilterFactory() {
        super(Config.class);
    }
 
 
    @Override
    public GatewayFilter apply(Config config) {
        return ((exchange, chain) -> {
            System.out.println("进入自定义过滤器");
            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response = exchange.getResponse();
            String key = config.getParam();
            System.out.println(key);
            return chain.filter(exchange);
        });
    }
 
    /**
     *  如果是自定义config 则需要重写该方法返回list集合 以便routdefine通过反射传回参数
     *  ShortcutConfiguratble 这个类获取配置
     *  RouteDefinitionRouteLocator.getFilters 获得所有过滤器 然后按顺序执行
     * @return
     */
    @Override
    public List<String> shortcutFieldOrder() {
        List<String> list = new ArrayList<>();
        list.add("param");
        list.add("param2");
        list.add("param3");
        list.add("param4");
        return list;
    }
 
    /**
     * 你再路由配置那里给过滤器设置了多少参数那么就创建多少个参数变量来接收值
     * 我在过滤器那里设置了四个参数 因此这里也设置四个
     *       routes:
     *         - id: nacos-custom1-service
     *           #lb是负载均衡 lb://注册的服务名
     *           uri: lb://nacos-custom1-service
     *           predicates: #路由断言 路由断言path中的第一个词不能和服务名相同 相同会被去除掉
     *             - Path=/custom1Service/** #第一个前缀就是你要发布出去的服务API名称 可以自定义 通过过滤器删掉就行
     *           filters:
     *             - StripPrefix=1
     *             - MyCustom=key1,key2,key3,value4 #自定义局部过滤器 类名:MyCustomFilterGatewayFilterFactory
     */
    static public class Config {
        private String param;
        private String param2;
        private String param3;
        private String param4;
 
        public String getParam2() {
            return param2;
        }
 
        public void setParam2(String param2) {
            this.param2 = param2;
        }
 
        public String getParam3() {
            return param3;
        }
 
        public void setParam3(String param3) {
            this.param3 = param3;
        }
 
        public String getParam4() {
            return param4;
        }
 
        public void setParam4(String param4) {
            this.param4 = param4;
        }
 
        public String getParam() {
            return param;
        }
 
        public void setParam(String param) {
            this.param = param;
        }
    }
 
 
}

  配置文件:自定义局部过滤器的名称一定是“GatewayFilterFactory”前面那一部分 原因是在路由定义创建的时候通过类名称remove了后面的通用名称

测试:

 

posted on   丶柚子  阅读(174)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示