spring-cloud微服务gateway
核心部分:routes(路由), predicates(断言),filters(过滤器)
id:可以理解为是这组配置的一个id值,请保证他的唯一的,可以设置为和服务名一致
uri:可以理解为是通过条件匹配之后需要路由到(跳转,重定向)到的新的服务地址
predicates:可以理解为是编写条件,满足条件才进行uri
filters:可以理解为是在路由前对请求的地址进行额外的其他操作,例如拼接或者裁减等
pom依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
yml配置网关
server:port: 8087
spring:application:name: gateway-nacoscloud:gateway:routes: #路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route #当前路由的标识,要求唯-uri: http://localhost:8086 #请求要转发到的地址order: 1 #路由的优先级,数字越小级别越高predicates: #断言(就是路由转发要满足的条件)- Path=/product-service/** #当请求路径满足Path指定的规则时,才进行路由转发#http://localhost:8087/product-service/product/9 路由器到⬇#http://localhost:8086/product-service/product/9filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 #转发之前去掉1层路径##http://localhost:8086/product/9
yml注册到nacos配置网关
server:port: 8087
spring:application:name: gateway-nacoscloud:nacos:discovery:server-addr: 192.168.11.47:18848username: nacospassword: nacosgateway:routes: #路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route #当前路由的标识,要求唯-uri: lb://product_naocs #lb指的是从nacos中按名称获取微服务,并遵循负载均衡策略order: 1 #路由的优先级,数字越小级别越高predicates: #断言(就是路由转发要满足的条件)- Path=/product-service/** #当请求路径满足Path指定的规则时,才进行路由转发filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 #转发之前去掉1层路径,
yml配置网关(约定大于配置的方式,一般不用这样的配置),例如访问http://localhost:8087/product-service/product/9 ,中的product-service为服务的名字
server:port: 8087
spring:application:name: gateway-nacoscloud:nacos:discovery:server-addr: 192.168.11.47:18848username: nacospassword: nacosgateway:discovery:locator:enabled: true #是否启动自动识别nacos服务(约定大于配置)
注意:若要使用自定义配置,则“不能开启注册中心的路由功能”,否则自定义的策略会失,设置中心路由功能为false
server:port: 8087
spring:application:name: gateway-nacoscloud:nacos:discovery:server-addr: 192.168.11.47:18848username: nacospassword: nacosgateway:discovery:locator:enabled: false #是否启动自动识别nacos服务(约定大于配置)
查看网关内置断言官网文档,如果用上时间可以设置获取使用方法:ZonedDateTime.now(),获取
内置断言例子,日期2024-01-20T17:42:47都可以访问,超过时间访问返回404
server:port: 8087
spring:application:name: gateway-nacoscloud:nacos:discovery:server-addr: 192.168.11.47:18848username: nacospassword: nacosgateway:routes: #路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route #当前路由的标识,要求唯-uri: http://localhost:8086 #请求要转发到的地址order: 1 #路由的优先级,数字越小级别越高predicates: #断言(就是路由转发要满足的条件)- Path=/product-service/** #当请求路径满足Path指定的规则时,才进行路由转发- Before=2024-08-20T17:42:47.789-07:00[America/Denver]filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 #转发之前去掉1层路径,- id: stock-nacos #当前路由的标识,要求唯-uri: http://localhost:8085 #请求要转发到的地址order: 1 #路由的优先级,数字越小级别越高predicates: #断言(就是路由转发要满足的条件)- Path=/stock-nacos/** #当请求路径满足Path指定的规则时,才进行路由转发- Before=2024-08-20T17:42:47.789-07:00[America/Denver]filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 #转发之前去掉1层路径,
内部断言的类名是有断言前缀和后缀组成如下
Path+RoutePredicateFactory
RemoteAddr+RoutePredicateFactory
RemoteAddr+RoutePredicateFactory
Header+RoutePredicateFactory
…
- RemoteAddr=192.168.1.1/24
- RemoteAddr=chocolate, ch.
- Header=X-Request-Id,\d+
- Host=**.testhost.org
基于Method请求方法的
- Method=GET
#多个路径使用逗号,隔开
- Path=/foo/{segment}1 , /product/add
- Query=baz, ba.
基于Path请求路径的断言工厂
自定义路由断言工厂
可以查看路径路由的断言工厂,选择AbstractRoutePredicateFactory按Ctrl+H既可以显示出全部的路由断言工厂,可以复制一份修改成自定义的断言工厂
自定义路由断言工厂需要继承 AbstadRoutepredicatefacdoy类,重写 ap)y方法的透辑,在apy方法中可以通过 excthange.geiequest) 拿到 serneiHpReque 对象,从而可以获取到清求的参数、请求方式、请求头等信息
1. 必须spring组件 bean
2. 类必须加上RoutePredicateFactory作为结尾(底层的处理的约定大于配置自定会读取到的)
3. 必须继承AbstractRoutePredicateFactory
4. 必须声明静态内部类 声明属性来接收 配置文件中对应的断言的信息
5. 需要结合shortcutFieldOrder进行绑定
6. 通过apply进行逻辑判断 true就是匹配成功 false匹配失败
自定义路由断言工厂类
package com.test.gate.config;import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;/*** @Description:* @Author: xu* @Data: 2024-2024/4/11-21* @Version: V1.0*/
@Component
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {public CheckAuthRoutePredicateFactory() {super(Config.class);}public List<String> shortcutFieldOrder() {return Arrays.asList("param");}public Predicate<ServerWebExchange> apply(final Config config) {return new GatewayPredicate() {public boolean test(ServerWebExchange exchange) {if (config.getParam().equals("zhangSan")) {return true;}return false;}public Object getConfig() {return config;}public String toString() {return String.format("Query: param=%s regexp=%s", config.getParam());}};}@Validatedpublic static class Config {private String param;public Config() {}public String getParam() {return this.param;}public void setParam(String param) {this.param = param;}}
}
yml配置(如果一个路由里面有多个断言条件是且的关系,都需要满足才跳转uri)
server:port: 8087
spring:application:name: gateway-nacoscloud:nacos:discovery:server-addr: 192.168.11.47:18848username: nacospassword: nacosgateway:
# discovery:
# locator:
# enabled: true #是否启动自动识别nacos服务(约定大于配置)routes: #路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route #当前路由的标识,要求唯-uri: http://localhost:8086 #请求要转发到的地址order: 1 #路由的优先级,数字越小级别越高predicates: #断言(就是路由转发要满足的条件)- Path=/product-service/**,/ddd/s #当请求路径满足Path指定的规则时,才进行路由转发- Before=2024-08-20T17:42:47.789-07:00[America/Denver]- CheckAuth=zhangSan1filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 #转发之前去掉1层路径,
查看网关各种局部过滤器官网
自定义网关过滤器和自定义断言都全部类似
继承AbstractNameValueGatewavFilterFactory日我们的自定义名称必须要以GatewavFiterFactorv结尾并交给spring管理
package com.test.gate.config;import com.alibaba.nacos.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;import java.util.Arrays;
import java.util.List;/*** @Description:* @Author: xu* @Data: 2024-2024/4/12-11* @Version: V1.0*/
@Componentpublic class CheckAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {private static Logger log = LoggerFactory.getLogger(CheckAuthGatewayFilterFactory.class);public List<String> shortcutFieldOrder() {return Arrays.asList("name");}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {log.info("调用checkAuthGatewayFilterFactory==="+ config.getName());String name = exchange.getRequest().getQueryParams().getFirst("name");if (StringUtils.isNotBlank(name)) {if (config.getName().equals(name)) {chain.filter(exchange);} else {//返回404exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);exchange.getResponse().setComplete();}//1 正常请求chain.filter(exchange);}return null;};}public static class Config {private String name;public Config() {}public String getName() {return this.name;}public void setName(String prefix) {this.name = name;}}
}
server:port: 8087
spring:application:name: gateway-nacoscloud:nacos:discovery:server-addr: 192.168.11.47:18848username: nacospassword: nacosgateway:
# discovery:
# locator:
# enabled: true #是否启动自动识别nacos服务(约定大于配置)routes: #路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route #当前路由的标识,要求唯-uri: http://localhost:8086 #请求要转发到的地址order: 1 #路由的优先级,数字越小级别越高predicates: #断言(就是路由转发要满足的条件)- Path=/product-service/**,/ddd/s #当请求路径满足Path指定的规则时,才进行路由转发- Before=2024-08-20T17:42:47.789-07:00[America/Denver]- CheckAuth=zhangSan1filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 #转发之前去掉1层路径,- CheckAuth=lisi
全局过滤器(Global Filters)配置
自定义全局过滤器(Global Filters)配置类(一般都是实现认证或者授权,或者做日记记录,不需要在配置文件做任何配置)
package com.test.gate.config;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** @Description:* @Author: xu* @Data: 2024-2024/4/12-20* @Version: V1.0*/
@Component
public class LogGlobalFilter implements GlobalFilter {private static Logger log = LoggerFactory.getLogger(LogGlobalFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//做业务处理,授权或者日记记录log.info(exchange.getRequest().getPath().value());return chain.filter(exchange);}
}
要启用 Reactor Netty 访问日志,请设置-Dreactor,netty.http,server.accessLogEnabled=true,它必须是 Java 系统属性,而不是 Spring Boot 属性。如果是jar包启动,就将网关打包成jar包,如下运行
java -jar gateway.jar -Dreactor,netty.http,server.accessLogEnabled=true
idea配置网关日记打印,在vm配置 -Dreactor.netty.http.server.accessLogEnabled=true
将网关日志记录全部输出到日志文件。以下示例创建一个Logback.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 按天滚动的文件输出 --><appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>G:\temptemptemp\gatewaylog\logfile.log</file> <!-- 修改为你想要保存日志文件的路径 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>G:\temptemptemp\gatewaylog\logfile.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 指定按日期滚动的文件名格式 --><maxHistory>30</maxHistory> <!-- 保留最多30天的历史日志文件 --></rollingPolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 异步日志输出 --><appender name="async" class="ch.qos.logback.classic.AsyncAppender"><appender-ref ref="ROLLING_FILE"/> <!-- 将异步 appender 链接到文件输出 --></appender><!-- 记录器配置 --><logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false"><appender-ref ref="async"/> <!-- 将异步 appender 应用于特定的日志记录器 --><appender-ref ref="STDOUT"/> <!-- 控制台输出 --></logger><!-- 根日志级别设置 --><root level="info"><appender-ref ref="STDOUT"/> <!-- 控制台输出 --><appender-ref ref="ROLLING_FILE"/> <!-- 将按天滚动的文件输出器添加到根输出器中 --></root></configuration>
Gateway跨域配置(CORS Configuration),网关官网跨域配置
方法一:yml配置文件配置跨域
spring:cloud:gateway:globalcors:cors-configurations:'[/**]': #运行跨域访问的资源allowedOrigins: "https://docs.spring.io" #跨域允许来源allowedMethods:- GET- POST
方法二:通过配置类设置跨域(注意UrlBasedCorsConfigurationSource 导入的包是import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource)
package com.test.gate.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;/*** @Description:* @Author: xu* @Data: 2024-2024/4/12-22* @Version: V1.0*/
@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedHeader("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}
网关限流整合sentinel官网
pom.xml添加依赖整合sentinel,和官网配置的有以下不一样是因为spring-cloud-alibaba-sentinel-gateway这个依赖比adapter依赖多了SentinelSCGAutoConfiguration自定注入例如很多需要的bean
<!--sentinel整台gateway 以前版本使用adapter-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<!--sentinel的依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置文件配置sentinel
# 配置sentinelsentinel:transport:dashboard: 127.0.0.1:8858 #sentiel的dashboard地址
相关文章:

spring-cloud微服务gateway
核心部分:routes(路由), predicates(断言),filters(过滤器) id:可以理解为是这组配置的一个id值,请保证他的唯一的,可以设置为和服务名一致 uri:可以理解为是通过条件匹配之后需要路由到&…...

【python】在pycharm创建一个新的项目
双击打开pycharm,选择create new project 选择create,后进入项目 右键项目根目录,选择new一个新的python file 随意命名一下 输入p 然后后面就会出现智能补全提示,此时轻敲一下tab,代码就写好了,非常的方便 右键执行一下代码,下面两个直接运行和debug运行都是可以的 小结 …...
java小作业(9)----用函数实现斐波那契数列(第二遍)
代码: public class Main {public static void main(String[] args) {int n 20; // 你可以更改这个值来计算和输出前n个斐波那契数for (int i 0; i < n; i) {System.out.print(fibonacci(i) " ");}}public static int fibonacci(int n) {if (n <…...

部署项目的时候的一些错误
项目打jar包,找不到资源,连接不上数据库 项目打包后无法运行 直接在idea运行可以 解决方法:pom文件中增加(配置文件如果是yml,写yml) <resources><resource><directory>src/main/java&…...

1044: 顺序栈基本操作的实现
解法: #include<iostream> #include<stack> using namespace std; int main() {int n, a, k;stack<int> sk;cin >> n;while (n--) {cin >> a;sk.push(a);}cin >> k;while (k--) {sk.pop();}if (!sk.empty()) {cout << s…...
微信小程序(总结)
1、wx.createSelectorQuery 在微信小程序中,wx.createSelectorQuery 是用于创建一个 SelectorQuery 对象的方法,而 this.createSelectorQuery 是在组件中获取元素的方法。 使用 wx.createSelectorQuery 创建的 SelectorQuery 对象可以用于获取页面中的…...

C#医学实验室/检验信息管理系统(LIS系统)源码
目录 检验系统的总体目标 LIS主要包括以下功能: LIS是集:申请、采样、核收、计费、检验、审核、发布、质控、耗材控制等检验科工作为一体的信息管理系统。LIS系统不仅是自动接收检验数据,打印检验报告,系统保存检验信息的工具&a…...
Linux驱动编程-module_platform_driver注册platform_driver
使用platform总线驱动模式编写Linux驱动时,需要注册platform_driver(用于跟.dts文件的platform_device匹配)。下面介绍2种常用注册platform_driver方法: 1、module_init()、module_exit() /* 定义平台drv,通过.name来…...

论文解读 --- 《针对PowerShell脚本的有效轻量级去混淆和语义感知攻击检测》
开篇 今天我们继续来解读安全行业优秀论文,通过学习他人的智慧成果,可以不断丰富我们的安全视野,使用它山之石来破解自身的难题。 这次要解读的论文为《Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for…...

在Spring Boot实战中碰到的拦截器与过滤器是什么?
在Spring Boot实战中,拦截器(Interceptors)和过滤器(Filters)是两个常用的概念,它们用于在应用程序中实现一些通用的逻辑,如日志记录、权限验证、请求参数处理等。虽然它们都可以用于对请求进行…...

数据可视化基础与应用-04-seaborn库人口普查分析--如何做人口年龄层结构金字塔
总结 本系列是数据可视化基础与应用的第04篇seaborn,是seaborn从入门到精通系列第3篇。本系列主要介绍基于seaborn实现数据可视化。 参考 参考:我分享了一个项目给你《seaborn篇人口普查分析–如何做人口年龄层结构金字塔》,快来看看吧 数据集地址 h…...
软考之【系统架构设计师】
系统架构设计师 根据原人事部、原信息产业部文件(国人部发[2003]39号)文件规定,计算机软件资格考试纳入全国专业技术人员职业资格证书制度的统一规划,实行统一大纲、统一试题、统一标准、统一证书的考试办法,每年举行…...

LigaAI x 极狐GitLab,共探 AI 时代研发提效新范式
近日,LigaAI 和极狐GitLab 宣布合作,双方将一起探索 AI 时代的研发效能新范式,提供 AI 赋能的一站式研发效能解决方案,让 AI 成为中国程序员和企业发展的新质生产力。 软件研发是一个涉及人员多、流程多、系统多的复杂工程&#…...
如何看待2023年图灵奖
目录 1.概述 2.计算复杂性理论 3.随机性和伪随机性 4.学术生涯和领导力 1.概述 图灵奖(Turing Award),全称A.M.图灵奖(ACM A.M Turing Award),是由计算机领域的最高学术机构——美国计算机协会…...

《云原生安全攻防》-- 云原生攻防矩阵
在本节课程中,我们将开始学习如何从攻击者的角度思考,一起探讨常见的容器和K8s攻击手法,包含以下两个主要内容: 云原生环境的攻击路径: 了解云原生环境的整体攻击流程。 云原生攻防矩阵: 云原生环境攻击路径的全景视图࿰…...

自然语言处理: 第二十七章LLM训练超参数
前言: LLM微调的超参大致有如下内容,在本文中,我们针对这些参数进行解释 training_arguments TrainingArguments(output_dir"./results",per_device_train_batch_size4,per_device_eval_batch_size4,gradient_accumulation_steps2,optim"adamw_8bi…...

Linux使用C语言实现Socket编程
Socket编程 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 网络套接字 socket: (电源)插座(电器上的)插口,插孔,管座 在通信过程中, 套接字是成对存在的, 一个客户端的套接字, 一个…...

Swin Transformer——披着CNN外皮的transformer,解决多尺度序列长问题
题目:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》作为2021 ICCV最佳论文,屠榜了各大CV任务,性能优于DeiT、ViT和EfficientNet…...

数据结构排序算法
排序也称排序算法(SortAlgorithm),排序是将一组数据,依指定的顺序进行排列的过程。 分类 内部排序【使用内存】 指将需要处理的所有数据都加载到内部存储器中进行排序插入排序 直接插入排序希尔排序 选择排序 简单选择排序堆排序 交换排序 冒泡排序快速…...

【深度剖析】曾经让人无法理解的事件循环,前端学习路线
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...