自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
注意: 命名需要以 RoutePredicateFactory 结尾
代码地址
https://gitee.com/zjj19941/ZJJ_Neaten5.10/tree/master/ZJJ_Gateway/demo06
配置
/**
* 自定义RoutePredicateFactory
*/
@Component
@Slf4j
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {
public CheckAuthRoutePredicateFactory() {
super(Config.class);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return new GatewayPredicate() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
log.info("调用CheckAuthRoutePredicateFactory" + config.getName());
if (config.getName().equals("fox")) {
return true;
}
return false;
}
};
}
/**
* 快捷配置
*
* @return
*/
@Override
public 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,loadbalancer
predicates:
# #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,loadbalancer
predicates:
# #Path路径匹配
- Path=/order/**
#自定义CheckAuth断言工厂
# - name: CheckAuth
# args:
# name: fox
- CheckAuth=monkey
重启项目
此时 CheckAuth=fox22,不符合自定义路由断言工厂规则
测试
此时访问是404