太平洋网站开发,销售管理系统有哪些,提高网站互动性,网站建设可行性实施报告问题#xff1a;Spring Cloud Gateway自带的断言#xff08;Predicate#xff09;不满足业务怎么办#xff1f;可以自定义断言#xff01;
先看Spring Cloud Gateway是如何实现断言的
Gateway中断言的整体架构如下#xff1a; public abstract class AbstractRoutePred…问题Spring Cloud Gateway自带的断言Predicate不满足业务怎么办可以自定义断言
先看Spring Cloud Gateway是如何实现断言的
Gateway中断言的整体架构如下 public abstract class AbstractRoutePredicateFactoryC extends AbstractConfigurableCimplements RoutePredicateFactoryC {public AbstractRoutePredicateFactory(ClassC configClass) {super(configClass);}
}可以看到Gateway的断言都是继承了AbstractRoutePredicateFactory抽象类。
自定义路由断言规则的步骤如下
新建类名CustomRoutePredicateFactory类名需要以以RoutePredicateFactory结尾并继承AbstractRoutePredicateFactory抽象类。重写apply()方法新建apply()方法所需的静态内部类CustomRoutePredicateFactory.Config这个Config就是我们的断言规则空参构造方法内部调用super()方法在Config类中配置自定义参数apply()中编写自定义的逻辑
import jakarta.validation.constraints.NotNull;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.web.server.ServerWebExchange;import java.util.function.Predicate;/*** 自定义路由断言工厂指定的用户类型才能访问** author gengducqq.com* since 2024-03-08*/
Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactoryCustomRoutePredicateFactory.Config {public CustomRoutePredicateFactory() {super(CustomRoutePredicateFactory.Config.class);}Overridepublic PredicateServerWebExchange apply(CustomRoutePredicateFactory.Config config) {return new GatewayPredicate() {Overridepublic boolean test(ServerWebExchange serverWebExchange) {// 这里可以编写自定义的逻辑// 获取请求中的信息判断是否符合条件String userType serverWebExchange.getRequest().getQueryParams().getFirst(userType);if (userType null) {return false;}// 判断用户类型是否符合return userType.equalsIgnoreCase(config.getUserType());}};}public static class Config {// 这里可以配置一些参数NotNullprivate String userType;public String getUserType() {return userType;}public void setUserType(String userType) {this.userType userType;}}
}这个时候已经可以使用我们自定义的断言了。 http://localhost:9527/order/gateway/get/1?userTypeadmin 在yml文件中配置
spring:cloud:gateway:routes:- id: custom_routeuri: https://example.orgpredicates:- name: Customargs:userType: admin # 当用户类型是admin的时候进行路由转发可以看到我们使用的配置方式是完全展开的参数配置方式Fully Expanded Arguments这个时候还是不支持快捷配置的。
为了让自定义的断言支持快捷配置Shortcut Configuration还需要实现shortcutFieldOrder()方法。 完整的代码如下
import jakarta.validation.constraints.NotNull;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.web.server.ServerWebExchange;import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;/*** 自定义路由断言工厂指定的用户类型才能访问** author gengducqq.com* since 2024-03-08*/
Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactoryCustomRoutePredicateFactory.Config {public CustomRoutePredicateFactory() {super(CustomRoutePredicateFactory.Config.class);}// 快捷配置支持Overridepublic ListString shortcutFieldOrder() {return Collections.singletonList(userType);}Overridepublic PredicateServerWebExchange apply(CustomRoutePredicateFactory.Config config) {return new GatewayPredicate() {Overridepublic boolean test(ServerWebExchange serverWebExchange) {// 这里可以编写自定义的逻辑// 获取请求中的信息判断是否符合条件String userType serverWebExchange.getRequest().getQueryParams().getFirst(userType);if (userType null) {return false;}// 判断用户类型是否符合return userType.equalsIgnoreCase(config.getUserType());}};}public static class Config {// 这里可以配置一些参数NotNullprivate String userType;public String getUserType() {return userType;}public void setUserType(String userType) {this.userType userType;}}
}