Spring-Cloud-Gateway Predicate谓词(断言)使用与自定义
自定义路由谓词需要继承 AbstractRoutePredicateFactory 工厂类,重写 apply() 方法的逻辑和shortcutFieldOrder方法。
在 apply() 方法中可以通过 serverWebExchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
apply() 方法的参数是自定义的配置类,在使用的时候配置参数,在 apply 方法中直接获取使用。
命名需要以 RoutePredicateFactory 结尾,比如 UserNameCheckRoutePredicateFactory,那么在使用的时候 UserNameCheck 就是这个路由谓词工厂的名称。代码如下所示。
自定义路由谓词可以根据业务重写路径匹配规则或请求路径日志跟踪。
本类例子:检查请求参数中的userName是否与配置的数据相同,如果相同则允许访问,否则不允许访问
package com.lynch.gateway.predicate;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
import javax.validation.constraints.NotEmpty;
import java.util.function.Predicate;
/**
* 自定义谓词工厂类
*
* 1、继承AbstractRoutePredicateFactory类
* 2、重写apply方法
* 3、apply方法的参数是自定义的配置类,可以在apply方法中直接获取使用配置参数。
* 4、类的命名需要以RoutePredicateFactory结尾
*
* 本类例子:检查请求参数中的userName是否与配置的数据相同,如果相同则允许访问,否则不允许访问
*/
@Component
public class UserNameCheckRoutePredicateFactory extends AbstractRoutePredicateFactory<UserNameCheckRoutePredicateFactory.Config> {
public UserNameCheckRoutePredicateFactory() {
super(Config.class);
}
@Override
public Predicate<ServerWebExchange> apply(UserNameCheckRoutePredicateFactory.Config config) {
// 写法1
return new Predicate<ServerWebExchange>() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
String userName = serverWebExchange.getRequest().getQueryParams().getFirst("userName");
if(StringUtils.isBlank(userName)){
return false;
}
//检查请求参数中的userName是否与配置的数据相同,如果相同则允许访问,否则不允许访问
if(userName.equals(config.getName())){
return true;
}
return false;
}
};
// 写法2
/*
return serverWebExchange -> {
String userName = serverWebExchange.getRequest().getQueryParams().getFirst("userName");
if(StringUtils.isBlank(userName)){
return false;
}
//检查请求参数中的userName是否与配置的数据相同,如果相同则允许访问,否则不允许访问
if(userName.equals(config.getName())){
return true;
}
return false;
};
*/
}
@Validated
public static class Config{
@NotEmpty
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
}
在application.yml中添加路由配置,如下:
spring:
application:
name: mima-cloud-gateway
cloud:
gateway:
routes:
#自定义谓词UserNameCheckRoutePredicateFactory的配置使用
#谓词用来匹配路径
- id: Auth_route
uri: lb://mima-cloud-producer
order: 1
predicates:
- Path=/**
# name配置为UserNameCheckRoutePredicateFactory类前缀UserNameCheck
# 只有访问http://localhost:8801/getheader?userName=lynch 才可以访问,否则为404
# 必须携带userName请求参数,并且值为lynch
- name: UserNameCheck
args:
name: lynch
server:
port: 8801
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
debug: true
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
shutdown: true
分类:
SpringCloud
, SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)