【第15章】Spring Cloud之Gateway网关过滤器(URL黑名单)
文章目录
- 前言
- 一、常用网关过滤器
- 1. 常用过滤器
- 2. 示例
- 3. Default Filters
- 二、定义接口服务
- 1. 定义接口
- 三、自定义过滤器
- 1. 过滤器类
- 2. 应用配置
- 四、单元测试
- 1. 正常
- 2. 黑名单
- 总结
前言
上一章我们通过,路由断言根据请求IP地址的黑名单功能,作用范围比较大。
这一章,我们通过网关过滤器来实现特定请求url的黑名单功能,作用范围进一步细化到接口。
一、常用网关过滤器
官方内置的网关过滤器太多了,这里我只介绍常用的部分
网关过滤器又分为前置和后置,比较典型的有:AddRequestHeader(前),AddResponseHeader(后)
1. 常用过滤器
| 过滤器类型 | 用法 | 描述 |
|---|---|---|
| AddRequestHeader | - AddRequestHeader=X-Request-red, blue | 将X-Request-red:blue请求头添加到所有匹配请求的下游请求头中。 |
| AddRequestHeadersIfNotPresent | - AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green | 在请求头不存在的情况下,为所有匹配请求的下游请求标头添加了2个标头X-Request-Color-1:bule和X-Request-Color-2:green |
| AddRequestParameter | - AddRequestParameter=red, blue | 将为所有匹配的请求在下游请求的查询参数中添加red=blue。 |
| AddResponseHeader | - AddResponseHeader=X-Response-Red, Blue | 这会将X-Response-Red:Blue添加到所有匹配请求的下游响应头中。 |
| RemoveRequestHeader | - RemoveRequestHeader=X-Request-Foo | 这将在X-Request-Foo请求头头被发送到下游之前将其删除。 |
| RemoveRequestParameter | - RemoveRequestParameter=red | 这将在向下游发送请求之前删除红色查询参数。 |
| RemoveResponseHeader | - RemoveResponseHeader=X-Response-Foo | 这将在响应返回给网关客户端之前从响应头中删除X-Response-Foo。 |
| PrefixPath | - PrefixPath=/mypath | 将为所有匹配请求添加前缀/mypath。因此,对/hello的请求被发送到/mypath/hello。 |
| StripPrefix | - StripPrefix=2 | 当通过网关向/name/blue/red发出请求时,向nameservice发出的请求替换为nameservice/red。 |
2. 示例
RewritePath
对于
/red/blue的请求路径,这会在发出下游请求之前将路径设置为/blue。请注意,由于YAML规范,$应该替换为$\。
spring:cloud:gateway:routes:- id: rewritepath_routeuri: https://example.orgpredicates:- Path=/red/**filters:- RewritePath=/red/?(?<segment>.*), /$\{segment}
ModifyRequestBody
修改请求正文
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {return builder.routes().route("rewrite_request_obj", r -> r.host("*.rewriterequestobj.org").filters(f -> f.prefixPath("/httpbin").modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,(exchange, s) -> Mono.just(new Hello(s.toUpperCase())))).uri(uri)).build();
}static class Hello {String message;public Hello() { }public Hello(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}
ModifyResponseBody
修改响应正文
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {return builder.routes().route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org").filters(f -> f.prefixPath("/httpbin").modifyResponseBody(String.class, String.class,(exchange, s) -> Mono.just(s.toUpperCase()))).uri(uri)).build();
}
3. Default Filters
要添加过滤器并将其应用于所有路由,可以使用
spring.cloud.gateway.default-filters。此属性接受过滤器列表。以下列表定义了一组默认过滤器:
spring:cloud:gateway:default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue- PrefixPath=/httpbin
更多网关过滤器请查看
二、定义接口服务
上一章我们使用的是提供者服务,这里就使用消费者服务,配置看起来会更加直观。
1. 定义接口
定义三个服务,分别是:
- user-service/hello
- user-service/hello1
- user-service/hello2
package org.example.nacos.consumer.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Create by zjg on 2024/7/21*/
@RestController
@RequestMapping("/consumer/")
public class HelloController {@RequestMapping("hello")public String hello(){return "hello consumer";}@RequestMapping("hello1")public String hello1(){return "hello consumer";}@RequestMapping("hello2")public String hello2(){return "hello consumer";}
}
三、自定义过滤器
1. 过滤器类
package org.example.gateway.filter;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.validation.constraints.NotEmpty;
import org.example.common.model.Result;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import reactor.core.publisher.Flux;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR;
import static org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType.GATHER_LIST;/*** Create by zjg on 2024/7/24*/
@Component
public class BlackListGatewayFilterFactory extends AbstractGatewayFilterFactory<BlackListGatewayFilterFactory.Config> {public BlackListGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();String path = request.getURI().getPath();if (config.url.contains(path)) {response.setStatusCode(HttpStatus.NOT_ACCEPTABLE);Result result = Result.error(HttpStatus.NOT_ACCEPTABLE.value(), "接口服务禁用", "该接口服务已加入黑名单,禁止访问!");ObjectMapper objectMapper = new ObjectMapper();try {return response.writeWith(Flux.just(response.bufferFactory().wrap(objectMapper.writeValueAsBytes(result))));} catch (JsonProcessingException e) {throw new RuntimeException(e);}}return chain.filter(exchange);};}@Overridepublic ShortcutType shortcutType() {return GATHER_LIST;}@Overridepublic List<String> shortcutFieldOrder() {return Collections.singletonList("url");}@Validatedpublic static class Config {@NotEmptyprivate List<String> url = new ArrayList<>();public List<String> getUrl() {return url;}public void setUrl(List<String> url) {this.url = url;}}
}
2. 应用配置
spring:cloud:gateway:routes:- id: provider-serviceuri: lb://provider-servicepredicates:- Path=/provider/**- BlackRemoteAddr=192.168.1.1/24,127.0.0.1,192.168.0.102- id: consumer-serviceuri: lb://consumer-servicepredicates:- Path=/consumer/**filters:- BlackList=/consumer/hello1,/consumer/hello2
四、单元测试
1. 正常
localhost:8888/consumer/hello
2. 黑名单
localhost:8888/consumer/hello1

localhost:8888/consumer/hello2

总结
回到顶部
这样我们就可以通过配置文件轻松地控制接口的对外服务。
相关文章:
【第15章】Spring Cloud之Gateway网关过滤器(URL黑名单)
文章目录 前言一、常用网关过滤器1. 常用过滤器2. 示例3. Default Filters 二、定义接口服务1. 定义接口 三、自定义过滤器1. 过滤器类2. 应用配置 四、单元测试1. 正常2. 黑名单 总结 前言 上一章我们通过,路由断言根据请求IP地址的黑名单功能,作用范围…...
pytorch和deep learning技巧和bug解决方法短篇收集
有一些几句话就可以说明白的观点或者解决的的问题,小虎单独收集到这里。 torch.hub.load how does it work 下载预训练模型再载入,用程序下载链接可能失效。 model torch.hub.load(ultralytics/yolov5, yolov5s)model torch.hub.load(ultralytics/y…...
【socket编程】UDP网络通信 {简单的服务器echo程序;简单的远程控制程序;简单的网络聊天室程序}
今天我们通过以下的几个surver/client模型了解一下UDP网络通信 一、简单的服务器echo程序 以下部分内容转载自「网络编程」简单UDP网络通信程序的实现_socket udp-CSDN博客 1.1 服务端 首先明确,这个简单的UDP网络程序分客户端…...
大数据存储解决方案:HDFS与NoSQL数据库详解
大数据存储解决方案:HDFS与NoSQL数据库详解 大数据存储解决方案在现代数据处理和分析中扮演着至关重要的角色。随着数据量的迅猛增长,传统的存储方式已经无法满足需求。HDFS(Hadoop分布式文件系统)和NoSQL数据库是当前最常用的两…...
如何用 ChatGPT 提升学术写作:15 个高效提示
在本文,我们详细探讨了如何利用 ChatGPT 提升学术写作的各个方面。我们帮助学术作者通过生成创意点子、构建论证结构、克服写作障碍以及格式化引用,从而显著提升其学术论文的质量。这 15 条提示不仅可以单独使用,还可作为学习的良好范例。 本…...
【算法】贪心算法
应用场景——集合覆盖问题 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号 贪心算法介绍 1.贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优的选择 2…...
常见中间件漏洞复现之【Jboss】!
Jboss介绍 JBoss是⼀个基于J2EE的开发源代码的应⽤服务器。JBoss代码遵循LGPL许可,可以在任何商业应⽤中免费使⽤。JBoss是⼀个管理EJB的容器和服务器,⽀持EJB1.1、EJB 2.0和EJB3的规范。但JBoss核⼼服务不包括⽀持servlet/JSP的WEB容器,⼀般…...
Java常用中间件(后续更新)
常用Java中间件总结 目录 引言什么是中间件常见的Java中间件 1. 消息队列中间件 1.1 RabbitMQ1.2 Apache Kafka 2. 数据库中间件 2.1 MySQL Proxy2.2 Hibernate 3. 服务治理中间件 3.1 Spring Cloud3.2 Dubbo 4. 缓存中间件 4.1 Redis4.2 Ehcache 总结 引言 在现代软件开发…...
网站或者网页Cookie 启用说明
背景说明 有时候登录网站的时候,某些网站的主页会弹出‘Cookie启用’的提示,比较好奇,于是就特别去查询相关资料研究了一下,以下是一个网页demo提示: 说明 Cookie 是一种在 Web 开发中广泛使用的机制…...
Java 抽象知识笔记总结(油管)
Java系列文章目录 Java Optional 容器笔记总结 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 抽象类的使用4.2 抽象类与接口的区别4.2.1 接口复习4.2.2 具体区别4.2.3 使用场景4.2.3.1 抽象类使用场景4.2.3.2 接口使用…...
鲜花销售小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,农户管理,产品分类管理,农产品管理,咨询信息管理,咨询回复管理,系统管理 微信端账号功能包括:系统首页&…...
Golang | Leetcode Golang题解之第324题摆动排序II
题目: 题解: func wiggleSort(nums []int) {n : len(nums)x : (n 1) / 2target : quickSelect(nums, x-1)transAddress : func(i int) int { return (2*n - 2*i - 1) % (n | 1) }for k, i, j : 0, 0, n-1; k < j; k {tk : transAddress(k)if nums[t…...
32、Python之面向对象:对象的表示,再论Python是dict包括语法糖
引言 在前面介绍Python容器的时候,我们曾经用过这种夸张的表述,“Python就是包裹在一堆语法糖中的字典”。虽然夸张,其实更多的是为了突出Python中dict的强大之处。今天这篇文章,打算看下Python中类对象、实例对象的表示及内存管理…...
高级java每日一道面试题-2024年8月07日-网络篇-你对TCP的三次握手了解多少?
如果有遗漏,评论区告诉我进行补充 面试官: 你对TCP的三次握手了解多少? 我回答: TCP(Transmission Control Protocol)的三次握手是TCP建立连接的过程,它是TCP/IP协议族中一个关键的概念。三次握手确保了双方之间的连接是双向的࿰…...
vite.config.ts中proxy的rewrite理解
服务器配置都是在开发情况下适用!! // 服务器配置 server: {//允许IP访问host: "0.0.0.0",//应用端口(默认:3000)port: Number(env.VITE_APP_PORT),// 运行是否自动打开浏览器open: true,// 代理配置proxy:…...
大数据环境下用户数据隐私安全防护系统的设计与实现(论文+源码)_kaic
摘 要 现如今互联网已在世界范围内广泛的应用和发展,特别是移动互联网Web 技术快速发展,然而最近几年经常发生互联网用户信息泄露及财产损失问题,网络安全漏洞严重威胁Web应用程序安全及互联网用户的网络使用安全,因此现急需一…...
基于springboot+vue+uniapp的“口腔助手”小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
算法刷题之链表
// 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 };ListNode* head new ListNode(5); 重要方法:虚拟头节点 个人方法:指针转为数组…...
C# 设计模式之适配器模式
总目录 前言 在实际的开发过程中,由于需求的变化和扩展,我们的代码也需要做相应的扩展。想象这样一个场景,原项目中接口返回的数据是XML格式的数据,但现在来了一个新客户,它期望接口返回的数据类型为json格式的。想要…...
BFS实现迷宫最短路径
结合队列的知识利用 广度优先遍历,通过对能走的路径的记录以及对走过路径的标记,进行多条路搜查 一、理论基础 如下图的迷宫: 选取所走方向(针对某一个位置)下,右,上,左࿰…...
AI开发-python-langchain框架(--并行流程 )惫
如果有多个供应商,你也可以使用 [[CC-Switch]] 来可视化管理这些API key,以及claude code 的skills。 # 多平台安装指令 curl -fsSL https://claude.ai/install.sh | bash ## Claude Code 配置 GLM Coding Plan curl -O "https://cdn.bigmodel.cn/i…...
Hitboxer终极指南:如何免费解决游戏键盘SOCD冲突的专业方案
Hitboxer终极指南:如何免费解决游戏键盘SOCD冲突的专业方案 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 还在为游戏中的键盘方向冲突而烦恼吗?当你在激烈的对战中同时按下左右方向键&…...
黑苹果EFI配置革命:3大痛点与OpCore Simplify的智能解决方案
黑苹果EFI配置革命:3大痛点与OpCore Simplify的智能解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 开篇直击:黑苹果配…...
保姆级教程:在YOLOv8.yaml里手动添加P2层,让你的模型看清8x8像素的小目标
在YOLOv8中集成P2层的实战指南:从配置文件修改到性能优化 当面对监控摄像头中快速移动的蚂蚁群或是卫星图像里的小型车辆时,传统目标检测模型往往会力不从心。这些8x8像素级别的微小目标,恰恰是许多实际应用场景中的关键检测对象。本文将彻底…...
从PDM到PCM:解码数字音频的底层转换逻辑
1. 为什么需要从PDM转换到PCM? 当你拆开一个智能音箱或者蓝牙耳机,里面那个指甲盖大小的数字麦克风,十有八九输出的是PDM信号。这种用"脉冲密度"表示声音强度的编码方式,就像用摩斯电码记录交响乐——虽然硬件实现简单&…...
JAVA:Spring Boot 集成 RDF4J 实现欺诈技术检测
1、简述 在大数据、知识图谱和金融风控等领域,RDF(Resource Description Framework) 是一种用于表示和查询关联数据的强大工具。RDF4J 是一个流行的 Java 库,用于操作 RDF 数据集,并支持 SPARQL 查询,能够帮助我们进行复杂的欺诈检测。 项目的核心功能: RDF 数据存储:…...
Ax扩展开发指南:如何编写自定义组件和插件
Ax扩展开发指南:如何编写自定义组件和插件 【免费下载链接】Ax Adaptive Experimentation Platform 项目地址: https://gitcode.com/gh_mirrors/ax2/Ax Ax作为Adaptive Experimentation Platform(自适应实验平台),提供了灵…...
.NET 11原生AI推理引擎深度评测:实测TensorRT/ONNX Runtime/ML.NET在x64与ARM64服务器上提速3.8倍的关键配置
第一章:.NET 11原生AI推理引擎的演进与企业级定位.NET 11标志着微软在统一AI与传统企业开发范式上的关键跃迁——其内置的原生AI推理引擎(Native AI Inference Engine)不再依赖外部Python运行时或模型服务桥接层,而是深度集成于Co…...
【iOS设备激活锁突破与合规应用指南:从技术原理到教育医疗场景落地】
【iOS设备激活锁突破与合规应用指南:从技术原理到教育医疗场景落地】 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 【问题象限:激活锁困局与合法需求】 核心概念:…...
vLLM-v0.17.1与Proteus仿真联动:为嵌入式设计添加自然语言交互
vLLM-v0.17.1与Proteus仿真联动:为嵌入式设计添加自然语言交互 1. 当电路设计遇上自然语言 想象这样一个场景:你正在设计一个嵌入式系统电路,突然想到"这里需要加个滤波电路来消除噪声"。传统方式需要手动查找元件库、绘制电路图…...
