【Gateway】基于ruoyi-cloud-plus项目,gateway局部过滤器和过滤返回以及集成nacos

news/2024/12/22 23:13:53/

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.ppmy.cn/news/1222655.html

相关文章

使用requests库设置no_proxy选项的方法

问题背景 在使用requests库进行HTTP请求时&#xff0c;如果需要使用爬虫IP服务器&#xff0c;可以通过设置proxies参数来实现。proxies参数是一个字典&#xff0c;其中包含了爬虫IP服务器的地址和端口号。然而&#xff0c;当前的requests库并不支持通过proxies参数来设置no_pr…

系列三、GC垃圾回收【总体概览】

一、GC垃圾回收【总体概览】 JVM进行GC时&#xff0c;并非每次都对上面的三个内存区域&#xff08;新生区、养老区、元空间/永久代&#xff09;一起回收&#xff0c;大部分回收的是新生区里边的垃圾&#xff0c;因此GC按照回收的区域又分为了两种类型&#xff0c;一种是发生在新…

U盘不能访问不一定是坏了,可能还有其他原因!U盘无法访问修复详解

当你将USB驱动器连接到计算机时,系统会将其识别为可移动驱动器,并启动其文件管理过程。 然而,用户现在注意到,即使可以检测到他们的USB驱动器,也无法访问它们。 如果幸运的话,拔下插头就能解决问题,但如果不是,请继续阅读以了解更多故障排除选项。 USB闪存驱动器是便…

Android开发:(AndroidStudio模拟器)如何将模拟器语言设置为中文 模拟器输入法更改为中文输入 键盘输入中文

文章目录 Android开发模拟器设置将模拟器语言设置为中文输入法中文的设置 Android开发模拟器设置 将模拟器语言设置为中文 第一步&#xff1a;打开模拟器后&#xff0c;上滑打开下面的设置图标。 第二步&#xff1a;找到 System (系统) &#xff0c;点击进入。 第三步&am…

idea一键打包docker镜像并推送远程harbor仓库的方法(包含spotify和fabric8两种方法)--全网唯一正确,秒杀99%水文

我看了很多关于idea一键打包docker镜像并推送harbor仓库的文章&#xff0c;不论国内国外的&#xff0c;基本上99%都是瞎写的&#xff0c; 这些人不清楚打包插件原理&#xff0c;然后就是复制粘贴一大篇&#xff0c;写了一堆垃圾&#xff0c;然后别人拿来也不能用。 然后这篇文…

python爬虫概述及简单实践:获取豆瓣电影排行榜

目录 前言 Python爬虫概述 简单实践 - 获取豆瓣电影排行榜 1. 分析目标网页 2. 获取页面内容 3. 解析页面 4. 数据存储 5. 使用代理IP 总结 前言 Python爬虫是指通过程序自动化地对互联网上的信息进行抓取和分析的一种技术。Python作为一门易于学习且强大的编程语言&…

layui表头多出一列(已解决)

问题描述 &#xff1a;layui表头多出来一列&#xff0c;但是表体没有内容&#xff0c;很影响美观。 好像是原本的表格有滚轮&#xff0c;我操作放大之后滚轮没有了&#xff0c;但是滚轮自带的表头样式还在&#xff0c; 之后手动把这个样式隐藏掉了&#xff0c;代码如下&#xf…

GAT里面的sofamax函数的实现:

1.sofamx 公式&#xff1a; 2. GAT里的sofamax函数的实现&#xff1a; 1. 因为指数在x轴正轴爆炸式地快速增长&#xff0c;如果zi比较大&#xff0c;exp⁡(zi)也会非常大&#xff0c;得到的数值可能会溢出。溢出又分为下溢出&#xff08;Underflow&#xff09;和上溢出&#x…