当前位置: 首页 > news >正文

SpringCloud 2023 Gateway的Filter配置介绍、类型、内置过滤器、自定义全局和单一内置过滤器

目录

  • 1. Filter介绍
  • 2. Filter类型
  • 3. 内置过滤器
    • 3.1 请求头(RequestHeader)相关GatewayFilter Factory
    • 3.2 请求参数(RequestParameter)相关GatewayFilter Factory
    • 3.3 回应头(ResponseHeader)相关GatewayFilter Factory
    • 3.4 前缀和路径相关GatewayFilter Factory
    • 3.5 Default Filters
  • 4. 自定义过滤器
    • 4.1 自定义全局过滤器
    • 4.2 自定义单一内置过滤器
      • 4.2.1 实现步骤:
      • 4.2.2 实现代码如下:
      • 4.2.3 application.yml配置
      • 4.2.4 测试

1. Filter介绍

类似SpringMVC里面的的拦截器Interceptor,Servlet的过滤器。“pre”和“post”分别会在请求被执行前调用和被执行后调用,用来修改请求和响应信息。可以用来做请求鉴权、异常处理、记录接口调用时长

2. Filter类型

  1. 全局默认过滤器Global Filters:作用于所有的路由。gateway出厂默认已有的,直接用即可,不需要在配置文件中配置,实现GlobalFilter接口即可
  2. 单一内置过滤器GatewayFilter:也可以称为网关过滤器,这种过滤器主要是作用于单一路由或者某个路由分组
  3. 自定义过滤器

3. 内置过滤器

SpringCloud Gateway共提供了38种内置的GatewayFilter Factory。这里我们指讲解常用的

因为Request的相关操作,是一个前置过滤器,所以需要在最终提供服务的服务方Pay中实现如下controller,查看Request的详细情况

    @GetMapping(value = "/pay/gateway/filter")public ResultData<String> getGatewayFilter(HttpServletRequest request){Enumeration<String> headerNames = request.getHeaderNames();while(headerNames.hasMoreElements()) {String headName = headerNames.nextElement();String headValue = request.getHeader(headName);System.out.println("请求头名: " + headName +"\t\t\t"+"请求头值: " + headValue);}Enumeration<String> parameterNames = request.getParameterNames();while(parameterNames.hasMoreElements()) {String parameterName = parameterNames.nextElement();String parameterValue = request.getParameter(parameterName);System.out.println("请求参数名: " + parameterName +"\t\t\t"+"请求参数值: " + parameterValue);}return ResultData.success(null);}

3.1 请求头(RequestHeader)相关GatewayFilter Factory

  • AddRequestHeader GatewayFilter Factory:向请求头添加内容,需要两个参数,一个是请求头key ,一个是请求头value。如果请求头已经有配置文件的请求头key,则配置失效。gatewayServer的application配置如下。向网关发送http://localhost:8088/pay/gateway/filter请求,Pay的controller打印日志请求头名: headerkey 请求头值: headerValue,表示网关的filter添加request header成功
spring:cloud:gateway:routes:- id: payRoute                   uri: lb://payment             predicates:- Path=/pay/**              filters:- AddRequestHeader=headerKey,headerValue
  • RemoveRequestHeader GatewayFilter Factory:向请求头删除内容,需要一个参数,表示需要删除的请求头key
    • 配置: - RemoveRequestHeader=sec-fetch-site
    • 效果:向网关发送http://localhost:8088/pay/gateway/filter请求,Pay的controller没有打印sec-fetch-site请求头的日志,表示网关的filter删除request header成功
  • SetRequestHeader GatewayFilter Factory:修改请求头的内容,需要两个参数,一个是要修改的请求头key ,一个是要修改的请求头value。如果要修改的请求头key不存在,则进行添加
    • 配置: - SetRequestHeader=sec-fetch-mode,my-navigate
    • 效果:向网关发送http://localhost:8088/pay/gateway/filter请求,Pay的controller打印日志请求头名: sec-fetch-mode 请求头值: my-navigate,表示网关的filter修改request header成功

3.2 请求参数(RequestParameter)相关GatewayFilter Factory

  • AddRequestParameter GatewayFilter Factory:向请求参数添加内容,需要两个参数,一个是参数key ,一个是参数value。如果请求参数已经有配置文件的参数key,则配置失效
    • 配置:- AddRequestParameter=username,lily
    • 效果:向网关发送http://localhost:8088/pay/gateway/filter请求,Pay的controller打印日志请求参数名: username 请求参数值: lily,表示网关的filter添加request parameter成功
  • RemoveRequestParameter GatewayFilter Factory:向请求参数删除内容,需要一个参数,表示需要删除的参数key
    • 配置:- RemoveRequestParameter=userid
    • 效果:向网关发送http://localhost:8088/pay/gateway/filter?userid=666请求,Pay的controller没有打印userid请求参数的日志,表示网关的filter删除request parameter成功

3.3 回应头(ResponseHeader)相关GatewayFilter Factory

  • AddResponseHeader GatewayFilter Factory:向响应头添加内容,需要两个参数,一个是响应头key ,一个是响应头value。如果配置文件的响应头key和已经有的响应头key一样,则配置继续有效

    • 配置:- AddResponseHeader=responseKey,responseValue
    • 效果:向网关发送http://localhost:8088/pay/gateway/filter请求,浏览器的Headers的Response Headers有responsekey: responseValue,表示网关的filter添加response header成功
  • SetResponseHeader GatewayFilter Factory:修改响应头的内容,需要两个参数,一个是要修改的响应头key ,一个是要修改的响应头value。如果要修改的响应头key不存在,则进行添加

    • 配置: - SetResponseHeader=Date,2099-12-31
    • 效果:向网关发送http://localhost:8088/pay/gateway/filter请求,浏览器的Headers的Response Headers的Date为date: 2099-12-31,表示网关的filter修改response header成功
  • RemoveResponseHeader GatewayFilter Factory:向响应头删除内容,需要一个参数,表示需要删除的响应头key

    • 配置: - RemoveResponseHeader=Content-Type
    • 效果:向网关发送http://localhost:8088/pay/gateway/filter请求,浏览器的Headers的Response Headers没有Content-Type这个响应header了,表示网关的filter删除response header成功

3.4 前缀和路径相关GatewayFilter Factory

  • PrefixPath GatewayFilter Factory:给请求自动添加路径前缀。gatewayServer的配置文件配置如下。向网关发送http://localhost:8088/gateway/filter请求,符合predicates的要求,则通过filter给路径添加前缀/pay,最终请求的路径是payment的http://localhost:8001/pay/gateway/filter。请求正常执行,表示网关的filter添加路径前缀成功
spring:cloud:gateway:routes:- id: payRoute                   uri: lb://payment             predicates:- Path=/gateway/**              filters:- PrefixPath=/pay
  • SetPath GatewayFilter Factory:对请求路径进行修改。gatewayServer的配置文件配置如下。向网关发送http://localhost:8088/pay2/gateway/filter请求,符合predicates的要求,则通过filter修改路径为/pay/gateway/filter,最终请求的路径是payment的http://localhost:8001/pay/gateway/filter。请求正常执行,表示网关的filter修改路径成功
spring:cloud:gateway:routes:- id: payRoute                   uri: lb://payment             predicates:- Path=/pay2/{segment1}/{segment2}  filters:- PrefixPath=/pay/{segment1}/{segment2}  # 不支持通配符**。{segment}表示占位符,需要保持上下一致
  • RedirectTo GatewayFilter Factory:将路径重定向到某个页面。gatewayServer的配置文件配置如下。向网关发送http://localhost:8088/pay/gateway/filter请求,符合predicates的要求,然后页面重定向打开的是百度的页面
spring:cloud:gateway:routes:- id: payRoute                   uri: lb://payment             predicates:- Path=/pay/**filters:- RedirectTo=302, http://www.baidu.com

3.5 Default Filters

前面讲过的GatewayFilter Factory都可以使用,但作用于所有的route。gateway配置文件配置如下。向网关发送http://localhost:8088/pay/gateway/filter请求,Pay的controller打印日志请求头名: headerkey 请求头值: headerValue,表示网关的filter添加request header成功

spring:cloud:gateway:default-filters:- AddRequestHeader=headerKey,headerValueroutes:- id: payRoute                   uri: lb://payment             predicates:- Path=/pay/**           

4. 自定义过滤器

4.1 自定义全局过滤器

  • 需求:统计每个请求的耗时时长
  • 思路:不管是在每个接口中进行统计;还是通过AOP + 反射形成注解然后进行使用。都会对业务代码形成入侵,可以通过自定义全局过滤器来实现
  • 步骤1:新建类MyGlobalFilter并实现GlobalFilter,Ordered两个接口。实现代码如下:
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {private static final String BEGIN_VISIT_TIME = "begin_visit_time";@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 先记录下访问接口的开始时间exchange.getAttributes().put(BEGIN_VISIT_TIME, System.currentTimeMillis());// 进行放行,然后通过then获取到接口的响应return chain.filter(exchange).then(Mono.fromRunnable(() -> {Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME);if (beginVisitTime != null) {System.out.println("接口主机: " + exchange.getRequest().getURI().getHost());System.out.println("接口端口: " + exchange.getRequest().getURI().getPort());System.out.println("接口URL: " + exchange.getRequest().getURI().getPath());System.out.println("接口URL参数: " + exchange.getRequest().getURI().getRawQuery());System.out.println("访问接口时长: " + (System.currentTimeMillis() - beginVisitTime) + "ms");System.out.println("###################################################");}}));}@Overridepublic int getOrder() {// 数字越小优先级越高return 0;}
}
  • 步骤2:无需配置application.yml
  • 测试:向网关发送http://localhost:8088/pay/gateway/filter请求,gatewayServer打印日志如下:
接口主机: localhost
接口端口: 8088
接口URL: /pay/gateway/filter
接口URL参数: null
访问接口时长: 313ms
###################################################

4.2 自定义单一内置过滤器

4.2.1 实现步骤:

  1. 在gatewayServer项目中新建自定义Filter Factory类MyGatewayFilterFactory。类名的后缀必须是GatewayFilterFactory。所以这里创建的是一个My Gateway Filter
  2. 类继承AbstractGatewayFilterFactory
  3. 实现无参构造器,调用父类的构造器
  4. 实现一个配置类MyGatewayFilterFactory.Config,定义需要添加前缀的reponse header key responseHeaderKey和给reponse header value添加的前缀responseHeaderPrefixValue
  5. 重写父类的apply方法,实现匹配reponse header的key和给reponse header的value添加前缀的逻辑
  6. 重写父类的shortcutFieldOrder方法,让其支持shortcut语法

4.2.2 实现代码如下:

import lombok.Getter;
import lombok.Setter;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {public MyGatewayFilterFactory() {super(MyGatewayFilterFactory.Config.class);}public static class Config {@Getter@Setterprivate String responseHeaderKey;      // 需要添加前缀的reponse header key@Getter@Setterprivate String responseHeaderPrefixValue;  // 给reponse header value添加前缀}@Overridepublic GatewayFilter apply(MyGatewayFilterFactory.Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return chain.filter(exchange).then(Mono.fromRunnable(() -> {// 获取reponse headersHttpHeaders responseHeaders = exchange.getResponse().getHeaders();responseHeaders.keySet().forEach(responseHeaderKey -> {// 如果reponse header的key和配置文件中的key相同,则给response hadear的value添加前缀if (responseHeaderKey.equals(config.getResponseHeaderKey())) {responseHeaders.set(responseHeaderKey, config.getResponseHeaderPrefixValue() + responseHeaders.getFirst(responseHeaderKey));}});}));// exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);// return exchange.getResponse().setComplete();}};}@Overridepublic List<String> shortcutFieldOrder() {// 列表: [responseHeaderKey, responseHeaderValue]return Arrays.asList("responseHeaderKey", "responseHeaderValue");}}

4.2.3 application.yml配置

全部展开语法配置如下:

            - name: Myargs:responseHeaderKey: DateresponseHeaderPrefixValue: test_

快捷语法配置: - My=Date,test_

4.2.4 测试

向网关发送http://localhost:8088/pay/gateway/filter请求。浏览器的Headers的Response Headers的Date为date: test_Mon, 12 Aug 2024 09:31:44 GMT,表示自定义单一内置过滤器成功

相关文章:

SpringCloud 2023 Gateway的Filter配置介绍、类型、内置过滤器、自定义全局和单一内置过滤器

目录 1. Filter介绍2. Filter类型3. 内置过滤器3.1 请求头(RequestHeader)相关GatewayFilter Factory3.2 请求参数(RequestParameter)相关GatewayFilter Factory3.3 回应头(ResponseHeader)相关GatewayFilter Factory3.4 前缀和路径相关GatewayFilter Factory3.5 Default Filte…...

从银幕到现实:擎天柱机器人即将改变我们的生活

擎天柱&#xff08;Optimus&#xff09;是《变形金刚》系列电影中的主角&#xff0c;如今也成为特斯拉正在开发的通用机器人。2022年10月&#xff0c;特斯拉展示了这一机器人的初始版本&#xff0c;创始人埃隆马斯克表示&#xff0c;希望到2023年能够启动生产。他指出&#xff…...

408算法题leetcode--第33天

509. 斐波那契数 题目地址&#xff1a;509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 题解思路&#xff1a;dp 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(n) 代码: class Solution { public:int fib(int n) {// dp数组含义&#xff1a;dp[i]即i位置…...

OCR模型调研及详细安装

OCR模型调研及详细安装 1 搭建 Tesseract-OCR 环境。 1.1 注意需先手动安装Tesseract-OCR, 下载地址&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/?CM;OD 注意&#xff1a;安装的时候选中中文包&#xff08;安装时把所有选项都勾上&#xff09;。 安装磁盘选择…...

C++第六讲:STL--vector的使用及模拟实现

C第六讲&#xff1a;STL--vector的使用及模拟实现 1.vector简介2.vector的常见接口介绍2.1constructor -- 构造2.2destructor -- 析构2.3begin、end2.3.1vector和string的区别、vector<string> 2.4rbegin、rend2.5cbegin、cend2.6crbegin、crend2.7size、max_size、resiz…...

2024年字节抖音前端面经,这次问的很基础!

文章同步在公众号&#xff1a;萌萌哒草头将军&#xff0c;欢迎关注&#xff01;&#xff01;&#xff01; 一面 es6新特性有哪些 新增了let、const关键字替换var声明变量&#xff0c;因为var会导致变量提升&#xff0c;在申明之前可以访问变量。新增了箭头函数&#xff0c;新…...

vscode提交修改Failed to connect to github.com port 443: Timed out

参考内容&#xff1a;timed out 只需3步&#xff1a;设置代理、取消代理、再次提交。&#x1f449; 2.1 设置代理 $ git config --global https.proxy 1 &#x1f449; 2.2 取消代理 $ git config --global --unset https.proxy 1之后关闭bash&#xff0c;再去vscode里面pull …...

通过docker镜像安装elasticsearch和kibana

目录 前言安装elasticsearch:7.17.21安装对应版本的kibana 前言 本文主要参考&#xff1a;https://blog.csdn.net/qq_23859799/article/details/138521052&#xff0c;内容基本一致&#xff0c;改动了部分错误 安装elasticsearch:7.17.21 拉取镜像&#xff1a;docker pull d…...

seaCMS v12.9代码审计学习(下半)

文章目录 admin/admin_safe.php任意文件下载CSRF 添加管理员账户CSRF配合XSS弹cookie admin/admin_safe.php任意文件下载 在admin_safe.php文件下有着这么一段代码&#xff0c;他的作用时检查action的值是否为download&#xff0c;如果为download那么将你传入的文件直接打印给…...

麒麟信安CentOS安全加固案例获评中国信通院第三届“鼎新杯”数字化转型应用奖

“鼎新杯”数字化转型应用大赛&#xff0c;由中国通信标准化协会主办、中国信息通信研究院承办&#xff0c;以落实国家“十四五”规划关于“加快数字化发展&#xff0c;建设数字中国”的总体要求为目标&#xff0c;意在打造一批具有产业引领与推广应用效应的企业数字化转型应用…...

Java 中消除 If-else 技巧总结

“过于依赖 if-else 不仅会让代码变得臃肿不堪&#xff0c;还会使维护成本大大增加。其实&#xff0c;if-else 虽然是最基础的条件分支&#xff0c;但它并不是万能的解决方案。简单粗暴的 if-else 很容易让代码可读性差、结构复杂。 今天&#xff0c;我将带大家了解一些取代 i…...

每个平台团队都应该跟踪的API指标

目录 识别关键 API 度量 基础架构/DevOps 应用工程/平台 产品管理 业务/增长 基础架构API指标 正常运行时间 CPU使用率 内存使用率 应用程序API指标 相应时间 平均和最大延迟 吞吐量 可用性 缓存命中率 每分钟错误数 每个业务事务的API调用 如何收集优化API指…...

Windows 11 24H2版本有哪些新功能_Windows 11 24H2十四大新功能介绍

距离上次发布的23H2版本已经过去了一年时间&#xff0c;现在&#xff0c;Win 11的24H2版本终于等到了&#xff0c;微软已经全面公开发布Win11 24H2版本&#xff0c;版本号为26100.1742&#xff0c;此次官宣的版本包括了消费者版、商业版、LTSC 2024版等&#xff0c;各种语言版本…...

渗透测试 之 AD域渗透 【Kerberoasting】 攻击技术讲解 对应得工具详细介绍哟~ 以及相关示例 按照步骤做你也会哟

说明 Kerberoasting 攻击发生在Kerberos协议的TGS_REP阶段&#xff0c;KDC的TGS服务返回一个由服务Hash加密的ST给客户端。由于该ST是用服务Hash进行加密的&#xff0c;因此客户端在拿到该ST后可以用于本地离线爆破。 攻击的过程 攻击者提供一个正常的域用户密码对域进行身份…...

如何在Ubuntu上更改MySQL数据存储路径

文章目录 0 背景1 备份现有数据库数据2 停止 MySQL 服务3 复制现有的 MySQL 数据到新目录4 修改 MySQL 配置文件5 更新 AppArmor 或 SELinux 配置&#xff08;如有启用&#xff09;6. 修改 MySQL 系统文件中的 datadir7. 启动 MySQL 服务8. 验证更改参考资料 0 背景 在原先划分…...

Cortex-M 内核的 OS 特性

目录 一、通用堆栈知识二、双堆栈用法三、PendSV 中断介绍和用法四、SVC 软中断介绍和用法五、特权级和非特权级使用方法 一、通用堆栈知识 在前面讲解 STM32 启动文件的时候就已经提到过&#xff0c;有关堆栈大小的设置是在启动文件中设置的&#xff1a; Heap 主要用于 Mal…...

第十六章 RabbitMQ延迟消息之延迟插件优化

目录 一、引言 二、优化方案 三、核心代码实现 3.1. 生产者代码 3.2. 消息处理器 3.3. 自定义多延迟消息封装类 3.4. 订单实体类 3.5. 消费者代码 四、运行效果 一、引言 上一章节我们提到&#xff0c;直接使用延迟插件&#xff0c;创建一个延迟指定时间的消息&…...

[单master节点k8s部署]32.ceph分布式存储(三)

基于ceph rbd生成pv 在集群中认证ceph 用下面代码生成ceph的secret .创建 ceph 的 secret&#xff0c;在 k8s 的控制节点操作&#xff1a; 回到 ceph 管理节点创建 pool 池&#xff1a; [rootmaster1-admin ~]# ceph osd pool create k8stest 56 pool k8stest created [rootm…...

git 相关问题解决一一记录

文章目录 gitssh.github.com: Permission denied (publickey)1. 检查 SSH 密钥生成新的 SSH 密钥添加 SSH 密钥到 GitHub 2. 配置 SSH 代理启动 SSH 代理添加私钥到 SSH 代理 3. 检查 SSH 配置文件4. 测试 SSH 连接5. 检查防火墙和网络设置6. 检查 GitHub 账户设置详细步骤 更新…...

UE4 材质学习笔记04(着色器性能优化)

一.着色器性能优化 1.衡量着色器的性能 衡量着色器性能的主要方法有三个 第一个&#xff1a;可以使用场景的视图模式的优化视图模式的着色器复杂度 下面的滑条代表了着色器指令的复杂度 如果场景大部分是绿色的&#xff0c;说明着色器耗能低&#xff0c;反之白色则是很糟糕…...

3、Redis Stack扩展功能

文章目录 一、了解Redis产品二、申请RedisCloud实例三、Redis Stack体验1、RedisStack有哪些扩展&#xff1f;2、Redis JSON1、Redis JSON是什么2、Redis JSON有什么用3、Redis JSON的优势 3、Search And Query1、传统Scan搜索2、Search And Query搜索 4、Bloom Filter1、布隆过…...

Flythings学习(二)控件相关

文章目录 1 前言2 通用属性2.1 控件ID值2.2 控件位置2.3 背景色2.4 背景图2.5 显示与隐藏2.6 控件状态2.7 蜂鸣器控制 3 文本类TextView4 按键类 Button4.1 系统按键4.2 处理按钮长按事件4.3 处理按键触摸事件 5 复选框CheckBox6 单选组 RadioGroup7 进度条&#xff0c;滑块7.1…...

关于multiprocessing使用freeze_support()方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、freeze_support()&#xff1f;二、使用方法总结 **注意下面** 如果有车载讨论需要的小伙伴&#xff0c;可以私信加我微信&#xff0c;拉你进群&#xff0c;…...

基于rk356x u-boot版本功能分析及编译相关(一)

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 uboot的分支是next-dev历史版本v2017-09uboot支持DM框架uboot前级pre-loader支持及引导下级uboot分区支持uboot支持固件格式secure bootuboot编译脚本位置build.shuboot/make.shrkbin仓库uboot的分支是next-dev历史版本v2017-…...

Jenkins---01

什么是敏捷开发 敏捷开发以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。在敏捷开 发中&#xff0c;软件项目在构建初期被切分成多个子项目&#xff0c;各个子项目的成果都经过测试&#xff0c;具备可视、 可集成和可运行使用的特征。换言之&…...

第十五届蓝桥杯C++B组省赛

文章目录 1.握手问题解题思路1&#xff08;组合数学&#xff09;解题思路2&#xff08;暴力枚举&#xff09; 2.小球反弹做题思路 3.好数算法思路&#xff08;暴力解法&#xff09;---不会超时 4.R格式算法思路 5.宝石组合算法思路---唯一分解定理 6.数字接龙算法思路----DFS 7…...

线程 vs 虚拟线程:深入理解及区别

Java 提供了两种线程机制&#xff1a;普通线程&#xff08;平台线程&#xff09;和 虚拟线程。普通线程是 Java 中经典的并发处理方式&#xff0c;而虚拟线程是随着 Java 21 引入的新特性&#xff0c;旨在提升并发性能和开发体验。本文将详细探讨它们的区别&#xff0c;并帮助你…...

【WEB应用安全测试指南–蓝队安全测试2】--超详细-可直接进行实战!!!亲测-可进行安全及渗透测试

安全基础理论入门知识参考上一篇《WEB应用安全测试指南蓝队安全测试1》 WEB应用安全测试指南2 一、文件 I/O 类1.1、任意文件上传1.2、任意文件下载1.3、文件包含 二、接口安全类2.1、短信炸弹2.2、邮件炸弹2.3、短信内容可控2.4、邮件内容可控 三、逻辑流程类3.1、越权3.2、未…...

使用HTML、CSS和JavaScript创建滚动弹幕效果

使用HTML、CSS和JavaScript创建滚动弹幕效果 在现代网页设计中&#xff0c;滚动文本是一种常见的动态效果&#xff0c;可以吸引用户的注意力并增强交互体验。在这篇博客文章中&#xff0c;我们将详细介绍如何使用HTML、CSS和JavaScript实现滚动文本效果。 效果 步骤1&#xf…...

【C语言】--数组

&#x1f60a;个人主页: 起名字真南 &#x1f60b;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 数组的概念2 一维数组的创建和初始化2.2 数组的初始化2.3 数组类型 3 一维数组的使用3.1 数组下标3.2 数组的输入 4 一维数组在内存中的存储5 sizeof计算数组中的元素6 二维…...