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了后面的通用名称
测试:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)