【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();}
}

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

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

相关文章

链动2+1模式:创新营销引领白酒产业新潮流

在当今高度竞争的市场环境中&#xff0c;创新营销模式对于企业的发展至关重要。链动21模式作为一种独特的营销策略&#xff0c;将白酒产品与该模式相结合&#xff0c;充分发挥其优势&#xff0c;通过独特的身份晋升和奖励机制&#xff0c;快速建立销售渠道&#xff0c;提高用户…

C++基础从0到1入门编程(二)

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 往期文章&#xff1a;C基础从0到1入门编程&#xff08;一&#xff09; 参考视频&#xff1a; 1.黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 2.系统化学习C 1 函数指针和回调函数 如果把函数的地址…

【C语言.oj刷题】有序#整型矩阵元素查找##{思路+C源码}

目录 题目信息 题目分析&#xff1a; 法一&#xff1a; 遍历二维数组&#xff08;低效&#xff09; 思路 源码 局限性 法二&#xff1a; 对每一行二分查找&#xff08;有所提效&#xff09; 思路 源码 局限性 法三&#xff1a; 利用一切有利条件使用二分查找 思路 …

由两个独立的高增益运算放大器组成的运放芯片D258,可应用于音频信号处理系统上

D258是由两个独立的高增益运算放大器组成。可以是单电源工作&#xff0c;也可以是双电源工作,电源的电流消耗与电源电压大小无关。应用范围包括变频放大器、DC增益部件和所有常规运算放大电路。 主要特点&#xff1a; ● 可单电源或双电源 工作 ● 在一个封装内的两个经…

vue3项目安装eslint和prettier

【几乎最全/全网最长的 2 万 字】前端工程化完整流程&#xff1a;从头搭到尾&#xff08;vue3 vite qiankun docker tailwindcss iview......&#xff09;_前端工程化流程-CSDN博客 vue3tsvite项目中使用eslintprettierstylelinthusky指南 - 掘金 上面两篇文章相互结合操…

网络工程师网络配置经典例题(五)

1、配置SwitchA的单臂静态BFD特性 [SwitchA] bfd [SwitchA-bfd] quit [SwitchA] bfd 1 bind peer-ip 10.2.2.2 interface vlanif 10 source-ip 10.1.1.1 one-arm-echo [SwitchA-bfd-session-1] discriminator local 1 [SwitchA-bfd-session-1] min-echo-rx-interval 200 …

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十三)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

解决:Error: Missing binding xxxxx\node_modules\node-sass\vendor\win32-x64-83\

一、具体报错 二、报错原因 这个错误是由于缺少 node-sass 模块的绑定文件引起的。 三、导致原因 3.1、环境发生了变化 3.2、安装过程出现问题 四、解决方法步骤&#xff1a; 4.1、重新构建 node-sass 模块 npm rebuild node-sass 4.2、清除缓存并重新安装依赖 npm c…

20231117在ubuntu20.04下使用ZIP命令压缩文件夹

20231117在ubuntu20.04下使用ZIP命令压缩文件夹 2023/11/17 17:01 百度搜索&#xff1a;Ubuntu zip 压缩 https://blog.51cto.com/u_64214/7641253 Ubuntu压缩文件夹zip命令 原创 chenglei1208 2023-09-28 17:21:58博主文章分类&#xff1a;LINUX 小工具 文章标签命令行压缩包U…

Google身份验证器Google Authenticator的java服务端实现

Google身份验证器Google Authenticator是谷歌推出的一款基于时间与哈希的一次性密码算法的两步验证软件令牌&#xff0c;此软件用于Google的认证服务。此项服务所使用的算法已列于RFC 6238和RFC 4226中。谷歌验证器上的动态密码按照时间或使用次数不断动态变化&#xff08;默认…

从CentOS向KeyarchOS操作系统的wordpress应用迁移实战

文章目录 从CentOS向KeyarchOS操作系统的wordpress应用迁移实战一、使用浪潮信息X2Keyarch迁移工具完成操作系统的迁移1.1 迁移前的验证1.2 执行迁移评估1.3 开始迁移1.4 验证迁移结果1.5 迁移后的验证 二、总结 从CentOS向KeyarchOS操作系统的wordpress应用迁移实战 CentOS是一…

Java-拼图小游戏

文章目录 main方法登录界面游戏主界面User类图片素材获取方式 基于Java实现的拼图小游戏&#xff0c;代码与图片素材来自b站up主黑马程序员的Java教学视频。 main方法 import ui.LoginJframe;public class App {public static void main(String[] args) {new LoginJframe(); …

Element UI 偶发性图标乱码问题

1. 问题如图所示 2. 原因&#xff1a;sass版本低 sass: 1.26.8 sass-loader: 8.0.2 3. 解决方法 (1) 提高sass版本 (2) 在vue.config.js中添加配置 css: {loaderOptions: {sass: {sassOptions: {outputStyle: expanded}}}},4. 遇到的问题 升级后打包&#xff0c;报错 Syntax…

CTFhub-RCE-过滤cat

查看当前目录&#xff1a;输入:127.0.0.1|ls 127.0.0.1|cat flag_42211411527984.php 无输出内容 使用单引号绕过 127.0.0.1|cat flag_42211411527984.php|base 64 使用双引号绕过 127.0.0.1|c""at flag_42211411527984.php|base64 使用特殊变量绕过 127.0.0.…

ES7.x 新特性与重大变化

1.1 ES7.0 自适应副本选择。更智能的选择副本。refresh刷新策略。在不设置刷新时间的情况下,从原来的默认1s刷新一次,添加一个判断策略,如果30s内没有搜索,则不再refresh。默认配置5个分片,改为1个分片。使用Lucene8, 改进了 top-k 查询的搜索性能 。更好的主节点选举能力…

微服务学习|Feign:快速入门、自定义配置、性能优化、最佳实践

RestTemplate方式调用存在的问题 先来看我们以前利用RestTemplate发起远程调用的代码 存在下面的问题 代码可读性差&#xff0c;编程体验不统一 参数复杂URL难以维护 Feign的介绍 Feign是一个声明式的http客户端&#xff0c;官方地址: https://github.com/OpenFeign/feign …

16.Oracle的数据字典和动态性能视图

oracle11g的数据字典和动态性能视图 一、什么是数据字典二、数据字典视图类型三、Oracle11g的动态性能视图 一、什么是数据字典 数据字典是整个oracle的核心&#xff0c;记录了数据库的最基本的信息。数据字典包括数据字典基本表和数据字典视图。数据字典基本表由$ORACLE_HOME…

【CSS】各百分比透明度 opacity 对应的 16 进制颜色值(例如:#FFFFFF80)

文章目录 使用&#xff1a;6位颜色值2位透明度值 color: #000000D4; /* 等价于 */ color: #000000; opacity : 0.83; /* 等价于 */ color: #000000; opacity : 83%; 对照表&#xff08;0&#xff1a;完全透明&#xff0c;1&#xff1a;不透明&#xff09; 透明度值百分百值十…

OpenAI 董事会与 Sam Altman 讨论重返 CEO 岗位事宜

The Verge 援引多位知情人士消息称&#xff0c;OpenAI 董事会正在与 Sam Altman 讨论他重新担任首席执行官的可能性。 有一位知情人士表示&#xff0c;Altman 对于回归公司一事的态度暧昧&#xff0c;尤其是在他没有任何提前通知的情况下被解雇后。他希望对公司的治理模式进行重…

客户管理系统大盘点!推荐这五款

客户管理系统大盘点&#xff01;推荐这五款。 客户管理系统也就是CRM&#xff0c;可以说是企业刚需&#xff0c;国内外的客户管理系统也是数不胜数&#xff0c;到底有哪些是真正好用&#xff0c;值得推荐的呢&#xff1f;本文将为大家推荐这5款好用的客户管理系统&#xff1a;…