📌 一、什么是 Gateway 的断言(Predicates)?

Predicates(断言) 是 Spring Cloud Gateway 中用于匹配请求的条件。只有请求满足断言条件,路由才会生效,转发到下游服务。


🎯 二、常见内置断言类型

断言类型示例配置对应断言工厂类说明
PathPath=/api/**PathRoutePredicateFactory匹配请求路径(支持通配符)
MethodMethod=GETMethodRoutePredicateFactory匹配请求方法(GET、POST等)
HeaderHeader=Auth, \w+HeaderRoutePredicateFactory匹配请求头,支持正则
QueryQuery=tokenQueryRoutePredicateFactory匹配 URL 查询参数(?key=value)
HostHost=**.example.comHostRoutePredicateFactory匹配请求 Host(域名)
CookieCookie=sessionId, \w+CookieRoutePredicateFactory匹配请求中的 Cookie
RemoteAddrRemoteAddr=192.168.0.1/24RemoteAddrRoutePredicateFactory匹配客户端 IP(支持 CIDR)
AfterAfter=2025-08-01T00:00:00+08:00AfterRoutePredicateFactory匹配某个时间之后的请求
BeforeBefore=2025-09-01T00:00:00+08:00BeforeRoutePredicateFactory匹配某个时间之前的请求
BetweenBetween=2025-08-01T00:00:00+08:00, 2025-08-31T23:59:59+08:00BetweenRoutePredicateFactory匹配时间范围内的请求
WeightWeight=group1, 80WeightRoutePredicateFactory灰度发布、流量权重控制

📦 三、断言使用方式(YAML 示例)

spring:cloud:gateway:routes:- id: user_routeuri: http://localhost:8081predicates:- Path=/user/**- Method=GET

🧱 四、自定义断言的必要性

当内置断言不能满足个性化业务需求时,例如:

  • 用户权限判断

  • 参数动态校验

  • 黑白名单过滤

  • 特定设备访问限制

就需要创建自定义断言。


🔧 五、自定义断言步骤(按请求参数控制)

✅ 目标:

只有当请求参数中 allow=true 时才允许路由。


📄 第一步:创建断言类

注意对于

//是1  return new Predicate<ServerWebExchange>() {
//还是2 return new GatewayPredicate() {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange exchange) {String value =  exchange.getRequest().getQueryParams().getFirst(config.getParam());return config.getExpectedValue() != null && config.getExpectedValue().equals(value);}
  • 2.0.x.RELEASE:✅ 有 Predicate<ServerWebExchange>,但没有 GatewayPredicate

  • 2.1.0.RELEASE 及以后:✅ 增加了 GatewayPredicate 接口,用于扩展断言工厂。

package com.example.gateway.predicates;import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;import java.util.function.Predicate;@Component
public class AllowParamRoutePredicateFactoryextends AbstractRoutePredicateFactory<AllowParamRoutePredicateFactory.Config> {public AllowParamRoutePredicateFactory() {super(Config.class);}//方式一 Lambda 表达式形式@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return exchange -> {String value = exchange.getRequest().getQueryParams().getFirst(config.getParam());return config.getExpectedValue() != null && config.getExpectedValue().equals(value);};}//方式二 匿名内部类形式@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return new Predicate<ServerWebExchange>() {@Overridepublic boolean test(ServerWebExchange exchange) {String value = exchange.getRequest().getQueryParams().getFirst(config.getParam());return config.getExpectedValue() != null && config.getExpectedValue().equals(value);}};
}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("param", "expectedValue");}@Data@NoArgsConstructorpublic static class Config {private String param;private String expectedValue;}
}

🧾 第二步:配置文件中使用

spring:cloud:gateway:routes:- id: allow_param_routeuri: http://localhost:8081predicates:#这个名称必须与AllowParamRoutePredicateFactory所匹配否则匹配不上#也就是说自定义拦截器叫HhRoutePredicateFactory#下面也要写成Hh=name,value - AllowParam=allow, true

🧪 第三步:访问测试

  • http://localhost:9000/test?allow=true → 匹配成功,转发到下游服务

  • http://localhost:9000/test?allow=false → 匹配失败,不转发


🧠 六、重点解释:值是怎么传入 config 的?

配置值注入原理:

  1. Spring Boot 自动读取 AllowParamRoutePredicateFactory

  2. 发现其内部的 Config 类中包含字段:paramexpectedValue

  3. 调用方法:

    @Override
    public List<String> shortcutFieldOrder() {return Arrays.asList("param", "expectedValue");
    }
    
  4. YAML 配置:

AllowParam=allow, true

➡️ 会自动赋值为:

config.param = "allow";
config.expectedValue = "true";

🧠 七、两行核心逻辑详解

String value = exchange.getRequest().getQueryParams().getFirst(config.getParam());
return config.getExpectedValue().equals(value);
  • 第一句:从请求参数中取出 config.param 指定的参数名的值

  • 第二句:判断这个值是否等于配置中 expectedValue


🔒 八、为什么写成断言而不是过滤器?

对比项断言(Predicate)过滤器(Filter)
作用时机匹配路由前路由匹配之后
是否转发决定是否进入路由已经进入路由,处理请求/响应
使用目的控制路由是否生效(入门条件)日志、限流、鉴权、响应处理等增强功能
推荐用途参数控制、角色控制、AB测试等认证授权、限流、Header 修改、响应包装等

✅ 九、总结

项目内容
自定义断言基类AbstractRoutePredicateFactory
配置值映射方式shortcutFieldOrder() 定义参数顺序
触发时机请求进入网关、匹配路由之前
使用场景请求参数判断、设备识别、用户等级判断等
与 Filter 区别Predicate 决定“要不要路由”,Filter 是增强
核心逻辑建议加入 null 判断,防止 NPE

🧰 十、可扩展场景建议

业务场景自定义断言建议逻辑
按用户权限分流从 JWT 中解析权限字段,判断是否匹配
灰度发布用户 ID 做 hash 取模,实现 10% 的灰度流量
手机访问拦截通过 User-Agent 判断是否来自移动端
限制访问时间判断当前时间是否处于营业时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918037.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918037.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918037.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片识别表格工具v3.0绿色版,PNG/JPG秒变可编辑Excel

[软件名称]: 图片识别表格工具v3.0绿色版 [软件大小]: 4.3 GB [软件大小]: 夸克网盘 | 迅雷网盘 软件介绍 表格快捕手 v3.0 绿色单文件版&#xff0c;无需安装&#xff0c;双击即可运行。支持 PNG、JPG 等常见图片格式&#xff0c;可精准识别其中的有线或无线表格&#xff…

线程池分析与设计

线程池 基本功能接口 C11 及以后的标准中&#xff0c;std::packaged_task和std::future是并发编程中用于任务封装和结果获取的重要组件&#xff0c;它们通常与线程配合使用&#xff0c;实现异步操作。 std::packaged_task std::packaged_task&#xff1a;封装可调用对象为异步任…

机器学习:线性回归

线性回归&#xff1a;研究自变量和因变量之间的关系。对于特征x(x1,x2,x3....)与对应的标签y&#xff0c;线性回归假设二者之间存在线性映射。f(x)w1xw2x(平方)w3x(三次方)...&#xff0c;权重w表示每个特征变量的重要程度。越大表示越重要。线性回归目标&#xff1a;求解w和b使…

如何将 Vue 前端、Hardhat 合约和 Node.js 后端集成到一个项目中

在区块链开发中&#xff0c;DApp&#xff08;去中心化应用&#xff09;的开发往往涉及到多个层次&#xff1a;前端、合约和后端。今天我们将演示如何将 Vue 前端、Hardhat 合约 和 Node.js 后端 放在一个项目中&#xff0c;来打造一个完整的区块链应用。1. 项目结构我们的目标是…

SQLite 创建表

SQLite 创建表 SQLite 是一款轻量级的数据库管理系统,因其体积小、速度快、易于使用等优点,被广泛应用于嵌入式系统、移动应用以及个人项目等领域。在 SQLite 中,创建表是进行数据存储的第一步。本文将详细介绍如何在 SQLite 中创建表,包括表结构定义、数据类型、约束条件…

学深度学习,有什么好的建议或推荐的书籍?

深度学习入门建议补基础数学&#xff1a;重点学线性代数&#xff08;矩阵运算&#xff09;、概率论&#xff08;分布&#xff09;、微积分&#xff08;梯度&#xff09;。编程&#xff1a;掌握PythonNumPy&#xff08;数组操作&#xff09;&#xff0c;能写基础数据处理代码。机…

自然语言处理×第四卷:文本特征与数据——她开始准备:每一次输入,都是为了更像你地说话

&#x1f380;【开场 她试着准备一封信&#xff0c;用你喜欢的字眼】&#x1f98a;狐狐&#xff1a;“她发现了一个问题——你每次说‘晚安’的方式都不一样。有时候轻轻的&#xff0c;有时候带着笑音&#xff0c;还有时候像在躲开她的心思。”&#x1f43e;猫猫&#xff1a;“…

【沉浸式解决问题】mysql-connector-python连接数据库:RuntimeError: Failed raising error.

目录一、问题描述二、场景还原1. 创建项目2. 安装mysql-connector-python3. 测试类三、原因分析四、解决方案1. 查看版本2. 切换python版本3. 切换mysql-connector-python版本4. 测试参考文献一、问题描述 初次使用mysql-connector-python连接mysql时报错 Traceback (most re…

【web页面接入Apple/google/facebook三方登录】

web页面接入Apple/谷歌/脸书三方登录 文章目录web页面接入Apple/谷歌/脸书三方登录前言一、apple登录使用步骤1.入口文件index.html引入js文件2.vue页面初始化支付按钮,并且点击按钮登录二、google登录使用步骤1.入口文件index.html引入js文件2.vue页面初始化支付按钮,并且点击…

管家婆分销软件中怎么删除过账单据?

在业务单据录入中&#xff0c;会出现单据保存过账后才发现数量或商品信息录入错误的情况&#xff0c;不想红冲单据&#xff0c;该怎么处理&#xff1f;今天来和小编一起学习下管家婆分销软件中怎么删除过账单据吧&#xff01;1&#xff0c;软件需要升级到9.92及以上版本&#x…

美颜SDK底层原理解析:直播场景下的美白滤镜实时处理方案

众所周知&#xff0c;美颜功能中&#xff0c;美白滤镜是使用频率最高的功能之一。它不仅能让肤色更通透、提亮整体画面&#xff0c;还能让观众感受到主播的“在线状态”与精神气。但你有没有想过&#xff0c;这个看似简单的“美白”背后&#xff0c;其实是一整套实时图像处理的…

系统构成与 Shell 核心:从零认识操作系统的心脏与外壳

系统构成与 Shell 核心&#xff1a;从零认识操作系统的心脏与外壳 很多人用电脑、用手机&#xff0c;但很少去想&#xff1a; 操作系统到底是怎么构成的&#xff1f; 为什么我们敲一个命令&#xff0c;系统就能乖乖执行&#xff1f; 这背后的关键&#xff0c;就在于系统的构成和…

wordpress的wp-config.php文件的详解

wp-config.php 是 WordPress 网站的核心配置文件&#xff0c;它存储了网站运行所需的基本配置信息&#xff0c;如数据库连接信息、安全密钥、调试模式等。以下是关于 wp-config.php 文件的详细解析&#xff1a; 1. 数据库连接信息 这是 wp-config.php 文件中最关键的部分&…

GPT-5 将在周五凌晨1点正式发布,王炸模型将免费使用??

就在今晚凌晨1点&#xff0c;OpenAI 又要搞大新闻了。 是的&#xff0c;就是大家期待已久的 GPT-5 发布会。 虽然官方还没明说&#xff0c;但各种“预热”已经安排得明明白白&#xff0c;Sam Altman 这波营销属实拉满了&#xff0c;发布会都还没开始&#xff0c;相关的代码和页…

MySQL UNION 操作符详细说明

目录 MySQL UNION 操作符详细说明 1. UNION 操作符简介 2. 基本语法 3. 使用规则和限制 4. UNION vs UNION ALL 5. 示例演示 6. 注意事项 MySQL UNION 操作符详细说明 MySQL 中的 UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c;生成一个单一的结果集。…

Dify 从入门到精通(第 20/100 篇):Dify 的自动化测试与 CI/CD

Dify 从入门到精通&#xff08;第 20/100 篇&#xff09;&#xff1a;Dify 的自动化测试与 CI/CD Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#x…

VSCode ssh一直在Setting up SSH Host xxx: Copying VS Code Server to host with scp等待

原因 大概率是远程服务器的下载有问题 原因1 远程服务器的网络不好 原因2 远程服务器的磁盘满了 我遇到的就是第二种&#xff0c;解决方法也很简单 VSCode ——> Help ——> About 会出现一些信息&#xff0c;例如下面的 Version: 1.97.2 (user setup) Commit: e54c774e0…

Spring Cloud 项目注册 Nacos 时设置真实 IP 的多种方式【多网卡/虚拟机实用指南】

&#x1f680; Spring Cloud 项目注册 Nacos 时设置真实 IP 的多种方式【多网卡/虚拟机实用指南】 前言 在使用 Spring Cloud Alibaba Nacos 注册服务时&#xff0c;常常会遇到 注册 IP 异常 的问题&#xff1a; 本机有多个网卡&#xff08;如 Docker、VM 虚拟机、VPN&#xf…

单片机裸机程序设计架构

文章目录一、前后台系统&#xff08;Foreground-Background System&#xff09;二、时间片轮询架构&#xff08;Time-Slicing Polling&#xff09;三、状态机架构&#xff08;State Machine&#xff09;四、事件驱动架构&#xff08;Event-Driven&#xff09;五、架构设计原则总…

odoo-061 PostgreSQL 中处理 NULL 值的 SQL 条件写法

文章目录1. 检查是否为 NULL2. NULL 值与比较运算符3. 在聚合函数中处理 NULL4. 在 WHERE 子句中的复杂条件注意事项在 PostgreSQL 中处理 NULL 值需要特别注意&#xff0c;因为 NULL 表示"未知"或"不存在"的值&#xff0c;与普通值的行为不同。以下是几种…