【Gateway】基于ruoyi-cloud-plus项目,gateway局部过滤器和过滤返回以及集成nacos
1.使用Gateway路由转发
1.1标题引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
1.2添加YML配置
spring:cloud:gateway:# 打印请求日志(自定义)requestLog: truediscovery:locator:#配置服务名使用小写lowerCaseServiceId: true#开启服务发现功能,从注册中心获取服务列表,(nacos->服务管理->服务列表)#默认服务名称需要为大写,可以通过配置lower-case-service-id: true 改变这一规则enabled: true#spring cloud gateway提供了XForwardedHeadersFilter,用来决定进行路由转发的时候转发哪些X-Forwarded相关的header,同时提供append选项,用来控制是否是追加还是覆盖到header中。#如果spring.cloud.gateway.x-forwarded.for-enabled为true,则会写入X-Forwarded-For#如果spring.cloud.gateway.x-forwarded.proto-enabled为true,则会写入X-Forwarded-Proto#如果spring.cloud.gateway.x-forwarded.port-enabled为true,则会写入X-Forwarded-Port#如果spring.cloud.gateway.x-forwarded.host-enabled为true,则会写入X-Forwarded-Hostx-forwarded:for-enabled: falsehost-enabled: falseport-enabled: falseproto-enabled: falseroutes:- id: Test01uri: https://127.0.0.1:8080predicates:- Path=/test01/**filters:- Test01=true- id: Test02uri: https://127.0.0.1:8081predicates:- Path=/test02/**,/test03/**filters:- Test02=true# redis 配置data:redis:# 地址host: localhost# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password: yourPassword# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms
mybatis-plus:# 不支持多包, 如有需要可在注解配置 或 提升扫包等级# 例如 com.**.**.mappermapperPackage: org.dromara.gateway.mapper# 对应的 XML 文件位置mapperLocations: classpath*:mapper/**/*Mapper.xml# 实体扫描,多个package用逗号或者分号分隔typeAliasesPackage: org.dromara.**.domainglobal-config:dbConfig:# 主键类型# AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID# 如需改为自增 需要将数据库表全部设置为自增idType: ASSIGN_ID
1.3 自定义过滤器
自定义Test01GatewayFilterFactory 过滤器,过滤上述配置的请求路径携带/test01/** 的请求,并转发到https://127.0.0.1:8080 + 请求路径
例:请求为 http;//127.0.0.1:8088/test01/ceshi 实际转发到 http;//127.0.0.1:8080/test/ceshi
请求参数内部可以下述过滤器内调整
@Component
@Slf4j(topic = "checkToken")
public class Test01GatewayFilterFactory extends AbstractGatewayFilterFactory<Test01GatewayFilterFactory.Param> {@Overridepublic GatewayFilter apply(Param param) {return ((exchange, chain) -> {Mono<Void> filter = chain.filter(exchange);UserMapper mapper = SpringUtils.getBean( UserMapper.class);//这是获取请求头信息HttpHeaders headers = exchange.getRequest().getHeaders();//这是获取请求参数信息//MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();//获取传入的授权信息,用于下面解密获取账号和密码String authorization = CustomStringUtil.customTrim(headers.getFirst("Authorization"));String id,pwd= null;try {String[] idAndPwd = new String(Base64.decodeBase64(authorization.substring(6))).split(":");id = idAndPwd [0];pwd = idAndPwd [1];} catch (Exception e) {return filter;}if (StrUtil.isEmpty(id) || StrUtil.isEmpty(pwd) ) {return filter;}User user= mapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getId, id.trim()));if(user== null){return filter;}String key = user.getKey();String secret = user.getSecret();if (StrUtil.isEmpty(key ) || StrUtil.isEmpty(secret)) {return filter;}//生成真实的授权信息String authorizationReal = "Basic " + Base64.encodeBase64String((key + ":" + secret).getBytes());ServerHttpRequest newRequest = exchange.getRequest().mutate().header("Authorization", authorizationReal).build();ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();filter = chain.filter(newExchange);return filter;});}public Test01GatewayFilterFactory () {super(Test01GatewayFilterFactory.Param.class);}@Data@AllArgsConstructor@NoArgsConstructorpublic static class Param {private boolean isCheckToken;}
自定义过滤返回信息
自定义Test02GatewayFilterFactory 过滤器,过滤上述配置的请求路径携带/test02/** ,/test03/**的请求,并转发到https://127.0.0.1:8081 + 请求路径
例:请求为 http;//127.0.0.1:8088/test02/ceshi或 http;//127.0.0.1:8088/test03/ceshi实际转发到 http;//127.0.0.1:8081/test/ceshi
请求参数内部可以下述过滤器内调整
@Component
@Slf4j(topic = "checkToken")
public class Test02GatewayFilterFactory extends AbstractGatewayFilterFactory<Test02GatewayFilterFactory.Param> {@Overridepublic GatewayFilter apply(Param param) {return ((exchange, chain) -> {Mono<Void> filter = chain.filter(exchange);UserMapper mapper = SpringUtils.getBean( UserMapper.class);//这是获取请求头信息HttpHeaders headers = exchange.getRequest().getHeaders();//这是获取请求参数信息//MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();//获取传入的授权信息,用于下面解密获取账号和密码String authorization = CustomStringUtil.customTrim(headers.getFirst("Authorization"));String id,pwd= null;try {String[] idAndPwd = new String(Base64.decodeBase64(authorization.substring(6))).split(":");id = idAndPwd [0];pwd = idAndPwd [1];} catch (Exception e) {return filter;}if (StrUtil.isEmpty(id) || StrUtil.isEmpty(pwd) ) {return filter;}User user= mapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getId, id.trim()));if(user== null){ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");String result = getJsonString(token);DataBuffer buffer = response.bufferFactory().wrap(result.getBytes(StandardCharsets.UTF_8));return response.writeWith(Flux.just(buffer));}String key = user.getKey();String secret = user.getSecret();if (StrUtil.isEmpty(key ) || StrUtil.isEmpty(secret)) {return filter;}//生成真实的授权信息String authorizationReal = "Basic " + Base64.encodeBase64String((key + ":" + secret).getBytes());ServerHttpRequest newRequest = exchange.getRequest().mutate().header("Authorization", authorizationReal).build();ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();filter = chain.filter(newExchange);return filter;});}public Test02GatewayFilterFactory () {super(Test02GatewayFilterFactory.Param.class);}@Data@AllArgsConstructor@NoArgsConstructorpublic static class Param {private boolean isCheckToken;}//封装成功的tokenpublic String getJsonString(String token){HashMap<String, Object> map = new HashMap<>();ArrayList<Map> objects = new ArrayList<>();HashMap<String, String> resultMap = new HashMap<>();resultMap.put("token",token);objects.add(resultMap);map.put("status","-1");map.put("message","认证失败");map.put("result",objects);String jsonString = JSONObject.toJSONString(map);return jsonString;}public class CustomStringUtil {public static String customTrim(String str){return Strings.isNullOrEmpty(str) ? str : str.trim();}
}
相关文章:
【Gateway】基于ruoyi-cloud-plus项目,gateway局部过滤器和过滤返回以及集成nacos
1.使用Gateway路由转发 1.1标题引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>1.2添加YML配置 spring:cloud:gateway:# 打印请求日志(自定义)…...
mysql -mmm
MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器) 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制&…...

C++初阶 类和对象(下)
目录 一、拷贝构造函数 1.1 什么是拷贝构造函数? 1.2 为什么得是引用? 1.3 使用拷贝构造函数 1.4 拷贝构造函数有什么用? 二、运算符重载 2.1 什么是运算符重载? 2.2 尝试前须知 2.3 常见运算符重载 2.3.1运算符重载 …...

使用Postman进行压力测试
1.打开Postman新建测试接口 2.点击右边保存,选择一个文件集合,如果没有就创建,然后保存 就是这个东西,这里不便展示出来,压力测试需要在文件夹里面进行 3.选择要测试的接口,iterations 表示请求发起次数&a…...

AI视频检索丨历史视频标签化,助力重要事件高效溯源
随着科技的不断发展,安全监控已成为我们生活中不可或缺的一部分。当发生盗窃、人员走失、安全事故等重要事件时,常常需要通过查看视频回放了解事情经过,为解决问题提供证据或指明查找方向。但是,人工查看视频回放往往费时费力&…...

【前段基础入门之】=>CSS3新特性 响应式布局
文章目录 概念媒体查询媒体类型媒体特性媒体运算符 概念 所谓对响应式布局方案的理解,众说纷纭,核心点就是同一套代码在不同尺度屏幕下的布局呈现方式的不同 社区中有很多人分享,并列出了多种实现响应式布局的方案,比如【 rem&…...

【Java 进阶篇】JQuery 遍历:发现元素的魔法之旅
欢迎来到 JQuery 的奇妙世界,一个充满活力和灵感的地方。在这个世界里,我们将一起探讨 JQuery 的遍历功能,这是一个让你轻松发现和操作网页元素的神奇工具。无需太多前端经验,只要有一颗探险的心,你就能在 JQuery 遍历…...

合肥数字孪生赋能工业制造,加速推进制造业数字化转型
聚焦国家战略需求和先进制造业发展方向,加快数字化发展战略部署,数字孪生、工业互联网、工业物联网已被广泛认为是工业革命的新引擎。合肥数字孪生正在推动工业制造从制造转向智造。通过数字化建模和仿真的方式,优化设计、生产、质量管理、供…...

Linux发展史与环境安装
Linux发展史与环境安装 一、Linux发展史推动技术进步的基本模式理解操作系统的发展理解Linux操作系统的发展 一、Linux的环境安装 一、Linux发展史 Linux和window XX其实都是一样的,定位:操作系统,企业内部,要给用户提供“互联网…...

【uniapp】 video视频层级、遮挡其他弹窗或顶部导航 使用nvue覆盖
uniapp 顶部导航和弹窗被video遮挡解决办法 第一步:配置 subNVues {"path": "pages/index/index","style": {"navigationBarTitleText": "uni-app","navigationStyle": "custom","app-…...

opencv(1):创建和显示窗口, 读取保存图片
下载源码,方便查看 API 信息。 快速在源码文件夹中搜索相关 api. grep“namedWindow(*-Rn// 限定 .h 文件 grep“namedWindow(*-Rn|grep "\.h" vscode 语法检测有问题 一直有波浪线 打开 vscode, setting 界面,搜索 python 在 setting.json…...
LeetCode530. Minimum Absolute Difference in BST
文章目录 一、题目二、题解 一、题目 Given the root of a Binary Search Tree (BST), return the minimum absolute difference between the values of any two different nodes in the tree. Example 1: Input: root [4,2,6,1,3] Output: 1 Example 2: Input: root [1,…...

Flink(五)【DataStream 转换算子(上)】
前言 这节注定是一个大的章节,我预估一下得两三天,涉及到的一些东西不懂就重新学,比如 Lambda 表达式,我只知道 Scala 中很方便,但在 Java 中有点发怵了;一个接口能不能 new 来构造对象? 答案是可以的&…...

【vitis】 AIE basic
AIE vs AIE-ML versal 期间分类 文件 操作 vitis -new -w . 安装...

微信抽奖活动怎么做
微信抽奖活动:打破传统,创新互动,带给你超乎想象的惊喜体验! 随着互联网的飞速发展,人们越来越热衷于参与各种线上活动。而微信,作为中国最大的社交平台之一,自然成为了各种活动的聚集地。今天…...

装机必备!这5款免费软件,你值得拥有!
目前win7渐渐退出视野,大部分人都开始使用win10了,笔者在日常的工作和使用中,为了能够让效率的大提升,下载了不少软件,以下的软件都是个人认为装机必备,而且都是可以免费下载。 1.屏幕亮度调节——Twin…...

华为eNSP综合实验考试
VLAN信息表 设备名称 端口 链路类型 VLAN 参数 HZ-HZCampus-Agg01-S5731 GE0/0/1 Trunk PVID:1 Allow-pass:10 20 Eth-trunk1(GE0/0/2,0/0/3,0/0/23) Trunk PVID:1 Allow-pass:10 20 GE0/0/24 Access PVID…...

OPPO Watch纯手机开启远程ADB调试
Wear OS手表中,我们可以直接在开发者设置中打开WiFi调试。但是这在OPPO等魔改Android系统中不再奏效。 需要什么?? 手表一台手机一个OTG转接头一个手表充电器一个 演示设备 手机: OPPO Find X手表: OPPO Watch 1代 …...

idea查看UML类图
idea查看UML类图 一、如何查看UML类图 1.1 选择需要查看的类或者包,鼠标右键,选择Diagrams->Show Diagram 1.2 对于UML类图中的包,选中后点击鼠标右键-> Expand Nodes(展开节点) 展开前 展开后 1.3 展开后分布比较凌乱ÿ…...
2736. 最大和查询 : 从一维限制到二维限制,逐步思考剖析本题(进阶一问)
题目描述 这是 LeetCode 上的 「2736. 最大和查询」 ,难度为 「困难」。 Tag : 「排序」、「离散化」、「树状数组」 给你两个长度为 n、下标从 0 开始的整数数组 nums1 和 nums2,另给你一个下标从 1 开始的二维数组 queries,其中 。 对于第…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
el-amap-bezier-curve运用及线弧度设置
文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...