自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
注意: 命名需要以 RoutePredicateFactory 结尾
代码地址
https://gitee.com/zjj19941/ZJJ_Neaten5.10/tree/master/ZJJ_Gateway/demo06
配置
/*** 自定义RoutePredicateFactory*/@Component@Slf4jpublic class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {public CheckAuthRoutePredicateFactory() {super(Config.class);}@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {log.info("调用CheckAuthRoutePredicateFactory" + config.getName());if (config.getName().equals("fox")) {return true;}return false;}};}/*** 快捷配置** @return*/@Overridepublic List<String> shortcutFieldOrder() {return Collections.singletonList("name");}/*** 需要定义一个内部类,该类用于封装application.yml中的配置*/public static class Config {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}
yml中配置
routes:- id: order_route #路由ID,全局唯一,建议配合服务名# uri参数可以直接去指定ip端口,也可以指定负载均衡lb开头#uri: http://localhost:8020 #目标微服务的请求地址和端口uri: lb://mall-order #lb 整合负载均衡器ribbon,loadbalancerpredicates:# #Path路径匹配- Path=/order/**#自定义CheckAuth断言工厂# - name: CheckAuth# args:# name: fox- CheckAuth=fox
测试
可以正常的访问
yml配置
routes:- id: order_route #路由ID,全局唯一,建议配合服务名# uri参数可以直接去指定ip端口,也可以指定负载均衡lb开头#uri: http://localhost:8020 #目标微服务的请求地址和端口uri: lb://mall-order #lb 整合负载均衡器ribbon,loadbalancerpredicates:# #Path路径匹配- Path=/order/**#自定义CheckAuth断言工厂# - name: CheckAuth# args:# name: fox- CheckAuth=monkey
重启项目
此时 CheckAuth=fox22,不符合自定义路由断言工厂规则
测试
此时访问是404
