银川网站建设公司哪家好/企业培训课程ppt

银川网站建设公司哪家好,企业培训课程ppt,做外汇的网站,无极游戏网一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源,导致资源占用过高。因此需要一定的手段实时阻止可疑或恶意的用户,减少攻击风险。 通过 IP 封禁,可以有效拉黑攻击者,防止资源被滥用,保障合法用户…

 一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源,导致资源占用过高。因此需要一定的手段实时阻止可疑或恶意的用户,减少攻击风险。

通过 IP 封禁,可以有效拉黑攻击者,防止资源被滥用,保障合法用户的正常访问。对于我们的需求,不让拉进黑名单的IP 访问任何接口

Sentinel本身支持请求来源的黑白名单判断,但默认是对应用级别进行判断,需要改造来源的获取方式为获取请求客户端的 IP,可参考这篇文章自定义来源。但是需要一定成本的

需求分析

使用Nacos是更轻量的动态 IP 黑白名单过滤的常用设计和实现方法。主要考虑以下几点:

IP 黑名单存储在哪里?

一般 IP 黑名单是动态增加的、需要持久化保存。常见的持久化方式包括数据库、配置文件或分布式存储系统(如 Redis),可以根据需要选择。

如何便捷地动态修改 IP 黑名单?

为了方便动态修改 IP 黑名单,所以这里考虑将 配置统一放入 配置中心,通过配置中心的管理页面,开发人员可以便捷地动态修改黑名单规则。Java 项目中,常用的配置中心是 Nacos。

黑白名单的判断逻辑应在哪里处理?

黑白名单逻辑通常部署在高性能的网关或 CDN 上,能更早地拦截非法请求,减轻后端压力。小型项目中,也可直接在应用程序的过滤器中处理

使用何种数据结构保存黑名单? 如何快速匹配用户请求的 IP 是否在黑名单中?

为了高效判断每个用户请求的 IP 是否在黑名单中,首先建议将IP 黑名单从持久化存储同步到本地缓存中,避免频繁查询远程数据源。

对于大流量刷题网站,大规模黑名单使用 布隆过滤器 来存储和过滤黑名单是比较好的,可以节约内存空间、提高检测效率。

最终方案如下

  1. 使用Nacos配置中心存储和管理 IP 黑名单

  2. 后端服务利用Web过滤器判断每个用户请求的 IP

  3. 后端服务利用布隆过滤器过滤 IP 黑名单

布隆过滤器

布隆过滤器是一种高效的概率数据结构,常用于检测一个元素是否在一个集合中,可以有效减少数据库的查询次数,解决缓存穿透等问题

布隆过滤器是由一个位数组k个独立的哈希函数组成。

  • 添加元素时,通过k个哈希函数将元素映射到位数组的k个位置上,将这些位置设置为 1。

  • 查询元素是否存在时,同样计算k个位置

    • 如果所有位置都是1,则说明元素可能存在(因为可能多个不同值通过哈希函数映射到同一位

    • 只要有一个位置为 0,就可以确定元素一定不存在。

其次布隆过滤器不能删除元素,因为可能多个元素映射到同一个位置,修改了这个位置,就会导致其它元素判断错误

Bloom Filter 的误判率与以下因素有关

  • 位数组的大小: 位数组越大,误判率越低,但空间开销会增大。(值会更离散)

  • 哈希函数的个数: 哈希函数越多,误判率越低,但计算成本会增加。(Hash 一次冲突,那我就多 Hash 几次,减少冲突概率)

  • 元素数量: 存入的元素越多,误判率会增加。

布隆过滤器适用场景

布隆过滤器一般都在海量数据判断场景,且可以允许误判。

  1. redis结合bitmap使用,解决缓存穿透的问题

  2. 黑名单校验,识别垃圾邮件

比如: 识别垃圾邮件,把所有黑名单地址都放在布隆过滤器中,在收到邮件时,判断邮件地址是否在布隆过滤器中即可。

Nacos配置中心

官网:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网 一个更易于构建云原生应用的动态服务发现,并且自动配置持久化,配置管理和服务管理平台

Nacos=Eureka+Config+Bus  比 SpringCloud Consul更为强大,并且自带负载均衡功能

下载安装运行

Nacos 快速开始 | Nacos 官网

https://github.com/alibaba/nacos/releases

解压直接运行bin目录下输入cmd命令
startup.cmd -m standalone      #代表单机非集群模式运行

运行成功后直接访问 http://localhost:8848/nacos/index.html

默认账号密码都是 nacos

后端开发

运行Nacos,创建配置,表示黑名单

blackIpList:- "1.1.1.1"- "2.2.2.2"

项目引入依赖

Nacos 融合 Spring Boot,成为注册配置中心 | Nacos 官网

<!--版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x版本-->
<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.12</version>
</dependency>
# 配置中心
nacos:config:server-addr: 127.0.0.1:8848  # nacos 地址bootstrap:enable: true         # 预加载data-id: praxisAI    # 控制台填写的 Data IDgroup: DEFAULT_GROUP  # 控制台填写的 grouptype: yaml            # 选择的文件格式auto-refresh: true    # 开启自动刷新
创建黑名单过滤工具类

新建blackfilter包,黑名单过滤相关的代码都放到该包下,模块化。参考文章,如果是分布式,还可以考虑 Redisson。可以用 Hutool 或 Guava 库自带的 bloomfilter,此处由于项目已经使用了 Hutool 工具库,就用其自带的BitMapBloomFilter即可。

/*** 黑名单过滤工具类*/
@Slf4j
public class BlackIpUtils {//静态的布隆过滤器,存IP黑名单,默认大小1000private static BitMapBloomFilter bloomFilter;
​// 判断 ip 是否在黑名单里public static boolean isBlackIp(String ip) {//true 表示可能在黑名单里//false 一定不在黑名单里return bloomFilter.contains(ip);}
​//获取 nacos 上的黑名单,添加到布隆过滤器中public static void rebuildBlackIp(String configInfo) {//判断配置信息是否为空if (StrUtil.isBlank(configInfo)) {configInfo = "{}";}// 解析 yaml 文件Yaml yaml = new Yaml();//将传入的配置信息解析成 Map 对象Map map = yaml.loadAs(configInfo, Map.class);
​// 获取配置中的 IP 黑名单List<String> blackIpList = (List<String>) map.get("blackIpList");
​// 加锁防止多线程修改布隆过滤器synchronized (BlackIpUtils.class) {//黑名单不为空if (CollUtil.isNotEmpty(blackIpList)) {// 注意构造参数的设置,容量越大,误判率越低BitMapBloomFilter bitMapBloomFilter = new BitMapBloomFilter(1000);//遍历黑名单,将黑名单添加到布隆过滤器中for (String blackIp : blackIpList) {bitMapBloomFilter.add(blackIp);}bloomFilter = bitMapBloomFilter;}//黑名单为空else {bloomFilter = new BitMapBloomFilter(1000);}}}
}

创建Nacos配置监听类

@RefreshScope配置动态刷新,当Nacos配置变化时,可以触发工具类的重新初始化,更新黑名单,但是仅仅只是更新到一个列表里,布隆过滤器内部是由代码控制的

所以这里直接通过 Nacos 控制台获取示例代码,在blackfilter包中新增监听器代码

整体流程

  1. Spring 容器启动后,调用 afterPropertiesSet 方法。

  2. 从 Nacos 获取当前的黑名单配置,并将其加载到布隆过滤器中。

  3. 并且注册一个监听器,用于监听 Nacos 配置的变化。

  4. 处理配置变化

    • 当 Nacos 配置发生变化时,监听器的 receiveConfigInfo 方法会被触发。

    • 新的配置内容会被传递给 BlackIpUtils.rebuildBlackIp 方法,重新构建布隆过滤器。

  5. 使用自定义线程池异步处理nacos配置变化,避免阻塞主线程。

/*** Nacos 监听器*/
@Slf4j
@Component
//表示该类会在 Spring 容器初始化完成后自动调用 afterPropertiesSet 方法
public class NacosListener implements InitializingBean {@NacosInjectedprivate ConfigService configService;  //与 nacos 配置中心交互@Value("${nacos.config.data-id}")private String dataId;@Value("${nacos.config.group}")private String group;@Overridepublic void afterPropertiesSet() throws Exception {log.info("nacos 监听器启动");//从 Nacos 获取指定 dataId 和 group 的配置内容String config = configService.getConfigAndSignListener(dataId, group, 3000L,new Listener() { //注册一个nacos监听器,监听配置信息的变化//定义线程工程final ThreadFactory threadFactory = new ThreadFactory() {//原子类,用于生成线程名称private final AtomicInteger poolNumber = new AtomicInteger(1);@Overridepublic Thread newThread(@NotNull Runnable r) {Thread thread = new Thread(r);thread.setName("refresh-ThreadPool" + poolNumber.getAndIncrement());return thread;}};//自定义线程池:使用固定大小的线程池,传入线程工厂,用于异步处理配置变化的逻辑final ExecutorService executorService = Executors.newFixedThreadPool(1, threadFactory);// 通过线程池异步处理黑名单变化的逻辑@Overridepublic Executor getExecutor() {return executorService;}// 监听后续黑名单变化//当nacos配置中心配置信息发生变化时,会接收新的配置configInfo加载到布隆过滤器中@Overridepublic void receiveConfigInfo(String configInfo) {log.info("监听到配置信息变化:{}", configInfo);//将新的黑名单配置加载到布隆过滤器中BlackIpUtils.rebuildBlackIp(configInfo);}});// 初始化黑名单BlackIpUtils.rebuildBlackIp(config);}
}
创建黑名单过滤器

黑名单应该对所有请求生效( 不止是 Controler 的接口 ),所以基于WebFilter实现而不是 AOP 切面。WebFilter的优先级高于@Aspect切面,因为它在整个 Web 请求生命周期中更早进行处理。

请求进入时的顺序:

  1. 首先,WebFilter拦截 HTTP 请求,并可以根据逻辑决定是否继续执行请求。

  2. 如果请求到过滤器并进入 Spring 的 Bean( 例如 Controller层 ),此时AOP切面生效,对匹配的 Bean 方法进行拦截

  3. 如果 @Aspect 没有阻止执行,最终请求到达 @Controller 或 @RestController 的方法

/*** 全局 IP 黑名单过滤请求拦截器*/
//声明一个过滤器,拦截所有的 HTTP 请求
@WebFilter(urlPatterns = "/*", filterName = "blackIpFilter")
public class BlackIpFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//获取客户端IP地址String ipAddress = NetUtils.getIpAddress((HttpServletRequest) servletRequest);//判断IP地址是否在黑名单中(布隆过滤器中)if (BlackIpUtils.isBlackIp(ipAddress)) {//如果在,则返回错误信息servletResponse.setContentType("text/json;charset=UTF-8");servletResponse.getWriter().write("{\"errorCode\":\"-1\",\"errorMsg\":\"黑名单IP,禁止访问\"}");return;}//放行请求filterChain.doFilter(servletRequest, servletResponse);}
}

最后需要在需要在启动类上加上@ServletComponentScan,这样过滤器才会被扫描到。

@SpringBootApplication
@MapperScan("com.zr.praxisai.mapper")
@EnableScheduling
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)  //开启SpringAOP功能
@ServletComponentScan  //扫描原生的 Servlet 组件(如过滤器、监听器、Servlet)
public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class, args);}
}
测试

通过 Nacos 控制台修改配置,本地测试的话直接加入本机 IP 即可,Nacos控制台可以看到改动记录和历史版本

blackIpList:- "1.1.1.1"- "2.2.2.2"- "0:0:0:0:0:0:0:1"

通过修改Nacos配置查看后端监听情况

通过Swagger测试发现直接打不开了

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

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

相关文章

开源的CMS建站系统可以随便用吗?有什么需要注意的?

开源CMS建站系统虽然具有许多优点&#xff0c;但并非完全“随便用”。无论选哪个CMS系统&#xff0c;大家在使用的时候&#xff0c;可以尽可能地多注意以下几点&#xff1a; 1、版权问题 了解开源许可证&#xff1a;不同的开源CMS系统采用不同的开源许可证&#xff0c;如GPL、…

故障识别 | 基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别,matlab代码

基于改进螂优化算法&#xff08;MSADBO&#xff09;优化变分模态提取&#xff08;VME&#xff09;结合稀疏最大谐波噪声比解卷积&#xff08;SMHD&#xff09;进行故障诊断识别 一、引言 1.1 机械故障诊断的背景和意义 在工业生产的宏大画卷中&#xff0c;机械设备的稳定运行…

探究 CSS 如何在HTML中工作

2025/3/28 向全栈工程师迈进&#xff01; 一、CSS的作用 简单一句话——美化网页 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 对于如上代码来说&#xff0c;其显示效果如下&#xff1…

硬件老化测试方案的设计误区

硬件老化测试方案设计中的常见误区主要包括测试周期不足、测试条件过于单一、样品选择不当等方面。其中&#xff0c;测试周期不足尤为突出&#xff0c;容易导致潜在缺陷未被完全暴露。老化测试本质上是通过加速产品老化来模拟长期使用状况&#xff0c;因此测试周期不足会严重削…

无锡零碳园区“三年突围”安科瑞源网荷储充系统如何破解“绿电难、储能贵、调度乱”困局?

零碳园区建设如火如荼&#xff0c;为何企业“不敢投、不会用”&#xff1f; 无锡市政府3月27日发布《零碳园区建设三年行动方案》&#xff0c;目标到2027年建成10家以上零碳园区、20家零碳工厂、10个源网荷储一体化项目。但企业仍存疑虑&#xff1a; 绿电消纳难&#xff1a;光…

docker torcherve打包mar包并部署模型

使用Docker打包深度网络模型mar包到服务端 参考链接&#xff1a;Docker torchserve 部署模型流程——以WSL部署YOLO-FaceV2为例_class myhandler(basehandler): def initialize(self,-CSDN博客 1、docker拉取环境镜像命令 docker images出现此提示为没有权限取执行命令&…

kubernetes》》k8s》》 kubeadm、kubectl、kubelet

kubeadm 、kubectl 、kubelet kubeadm、kubectl和kubelet是Kubernetes中不可或缺的三个组件。kubeadm负责集群的快速构建和初始化&#xff0c;为后续的容器部署和管理提供基础&#xff1b;kubectl作为命令行工具&#xff0c;提供了与Kubernetes集群交互的便捷方式&#xff1b;而…

linux 硬盘扩展

场景&#xff1a; [rootlocalhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 40G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1G 0 part /boot └─sda3 …

Docker Desktop 界面功能介绍

Docker Desktop 界面功能介绍 左侧导航栏 Containers(容器): 用于管理容器,包括查看运行中或已停止的容器,检查容器状态、日志,执行容器内命令,启动、停止、删除容器等操作。Images(镜像): 管理本地 Docker 镜像,可查看镜像列表、从 Docker Hub 拉取新镜像、删除镜…

数据设计(范式、步骤)

文章目录 数据设计1.数据库设计的三大范式2、数据库设计的具体步骤 数据设计 1.数据库设计的三大范式 关系型数据库的三大范式&#xff0c;指导如何设计一个关系型数据库。 1NF&#xff1a; 关系表的每个字段&#xff0c;都应该是不可再分的&#xff0c;——保证原子性。 字…

PhotoShop学习03

1.更改图像大小 通常情况下&#xff0c;如果我们想在某些上传图片&#xff0c;会发现我们的图片可能会过大或者过小&#xff0c;为此&#xff0c;我们需要调整图像的大小&#xff0c;使之符合网站的规则。 首先打开photoshop&#xff0c;打开一张图片。首先我们需要了解这张图…

【区块链安全 | 第二篇】区块链概念详解

文章目录 概述1. 区块链类型2 区块链五层架构3 账本模型4. 节点&#xff08;Node&#xff09;5. 区块&#xff08;Block&#xff09;6. 区块链&#xff08;Blockchain&#xff09;7. 区块链工作流程 核心技术1. 共识机制2. 智能合约 主要组件1. 交易&#xff08;Transaction&am…

Redisson - 分布式锁和同步器

文章目录 锁&#xff08;Lock&#xff09;公平锁&#xff08;Fair Lock&#xff09;联锁&#xff08;MultiLock&#xff09;红锁&#xff08;RedLock&#xff09; 【已废弃】读写锁&#xff08;ReadWriteLock&#xff09;信号量&#xff08;Semaphore&#xff09;可过期许可信号…

HarmonyOS:GridObjectSortComponent(两个Grid之间网格元素交换)

一、概述 网格对象的编辑排序是用于网格对象的编辑、拖动排序、新增和删除。 说明 该组件从API Version 11开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 二、导入模块 import { GridObjectSortComponent, GridObjectSortComponentItem…

智能监控视频聚合平台,GB28181/RTSP/SIP/RTMP直播会议融合方案

全场景智能监控聚合平台&#xff1a;打破边界&#xff0c;赋能高效协同 在数字化转型加速的今天&#xff0c;海量视频监控设备、多样化的编码协议与复杂的业务场景&#xff0c;让企业面临跨系统整合难、资源调度效率低、协作响应慢等痛点。我们的智能监控聚合平台以技术创新为…

IP数据报报文格式

一 概述 IP数据报由两部分组成&#xff1a;首部数据部分。首部的前一部分是固定长度&#xff0c;一共20字节大小&#xff0c;是所有IP数据报文必须具有的&#xff1b;固定部分后面是一些可选字段&#xff0c;其长度是可变的。 二 首部固定部分各字段意义 &#xff08;1&…

【电子通识】案例:为什么电子产品制造过程中使用马克笔在FFC/FPC连接器打点进行标记

在电子产品制造过程中&#xff0c;使用马克笔在FFC/FPC连接完成后进行打点标记&#xff08;或类似目视化检查方法&#xff09;&#xff0c;是一种常见的“过程防错&#xff08;Poka-Yoke&#xff09;”手段&#xff0c;其核心目的是通过简单、直观的方式确保关键工序的执行质量…

Linux中断处理流程

Linux中断处理流程 在Linux内核中&#xff0c;中断控制器管理硬件中断号到Linux中断号的映射&#xff0c;并通过中断描述符&#xff08;struct irq_desc&#xff09;进行管理。存储这种映射关系的方式取决于中断编号的连续性&#xff0c;具体实现如下&#xff1a; 1. 数组存储&…

Java 大视界 -- 基于 Java 的大数据隐私计算在医疗影像数据共享中的实践探索(158)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…