- 自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑和shortcutFieldOrder方法。
- 在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
- apply 方法的参数是自定义的配置类,在使用的时候配置参数,在 apply 方法中直接获取使用。
命名需要以 RoutePredicateFactory 结尾,比如 AuthRoutePredicateFactory,那么在使用的时候 Auth 就是这个路由断言工厂的名称
具体实现
/**
* 自定义 Gateway 断言 Auth 后面必须为 RoutePredicateFactory
*/
@Component
public class AuthRoutePredicateFactory extends AbstractRoutePredicateFactory<AuthRoutePredicateFactory.Config> {
public static final String AUTHO_KEY = "name";
public static final String AUTHO_VALUE = "value";
public AuthRoutePredicateFactory() {
super(Config.class);
}
/**
* 表示配置填写的顺序,例如:- Auth=zhangsan,xxx, zhangsan 代表 AUTHO_KEY , xxx 代表 AUTHO_VALUE
* @return
*/
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList(AUTHO_KEY,AUTHO_VALUE);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
// 如果 Header 中携带了某个值,进行 header 的判断
return (exchange -> {
// 获取请求 header
HttpHeaders httpHeaders = exchange.getRequest().getHeaders();
// 获取指定 header
List<String> headerList = httpHeaders.get(config.getName());
if(headerList.contains(config.value)){
return true;
}
return false;
});
}
public static class Config{
private String name;
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
application.yml 配置
server:
port: 8080
spring:
application:
name: spring-cloud-gateway
cloud:
gateway:
routes:
# 自定义断言
- id: auth_route
predicates:
# 匹配路径转发
- Path=/auth/**
# 匹配 header 中 一个 key 为 zhansan ,value 为 xxx 的值
- Auth=zhangsan,xxx
filters:
# 去取前缀的个数,StripPrefix=1 代表去除一位,比如请求 /gateway/a/b 会转发到 /a/b
# StripPrefix=2 去除两位 比如请求 /gateway/a/b 会转发到 /b
- StripPrefix=1
# 映射到的地址
uri: https://www.taobao.com
网友评论