自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
注意: 命名需要以 RoutePredicateFactory 结尾

代码地址

https://gitee.com/zjj19941/ZJJ_Neaten5.10/tree/master/ZJJ_Gateway/demo06

配置

  1. /**
  2. * 自定义RoutePredicateFactory
  3. */
  4. @Component
  5. @Slf4j
  6. public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {
  7. public CheckAuthRoutePredicateFactory() {
  8. super(Config.class);
  9. }
  10. @Override
  11. public Predicate<ServerWebExchange> apply(Config config) {
  12. return new GatewayPredicate() {
  13. @Override
  14. public boolean test(ServerWebExchange serverWebExchange) {
  15. log.info("调用CheckAuthRoutePredicateFactory" + config.getName());
  16. if (config.getName().equals("fox")) {
  17. return true;
  18. }
  19. return false;
  20. }
  21. };
  22. }
  23. /**
  24. * 快捷配置
  25. *
  26. * @return
  27. */
  28. @Override
  29. public List<String> shortcutFieldOrder() {
  30. return Collections.singletonList("name");
  31. }
  32. /**
  33. * 需要定义一个内部类,该类用于封装application.yml中的配置
  34. */
  35. public static class Config {
  36. private String name;
  37. public String getName() {
  38. return name;
  39. }
  40. public void setName(String name) {
  41. this.name = name;
  42. }
  43. }
  44. }

yml中配置

  1. routes:
  2. - id: order_route #路由ID,全局唯一,建议配合服务名
  3. # uri参数可以直接去指定ip端口,也可以指定负载均衡lb开头
  4. #uri: http://localhost:8020 #目标微服务的请求地址和端口
  5. uri: lb://mall-order #lb 整合负载均衡器ribbon,loadbalancer
  6. predicates:
  7. # #Path路径匹配
  8. - Path=/order/**
  9. #自定义CheckAuth断言工厂
  10. # - name: CheckAuth
  11. # args:
  12. # name: fox
  13. - CheckAuth=fox

测试

可以正常的访问
image.png

yml配置

  1. routes:
  2. - id: order_route #路由ID,全局唯一,建议配合服务名
  3. # uri参数可以直接去指定ip端口,也可以指定负载均衡lb开头
  4. #uri: http://localhost:8020 #目标微服务的请求地址和端口
  5. uri: lb://mall-order #lb 整合负载均衡器ribbon,loadbalancer
  6. predicates:
  7. # #Path路径匹配
  8. - Path=/order/**
  9. #自定义CheckAuth断言工厂
  10. # - name: CheckAuth
  11. # args:
  12. # name: fox
  13. - CheckAuth=monkey

重启项目
此时 CheckAuth=fox22,不符合自定义路由断言工厂规则

测试

此时访问是404
image.png