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

【IP限流】⭐️通过切面实现无校验保护接口的防刷逻辑

目录

🍸前言

🍻一、实现方法

🍺二、伪代码实现

🍹三、章末


🍸前言

        小伙伴们大家好,上次写了一篇文章记录了最近自己装台式电脑中遇到的问题,以及整体的安装步骤和本地的配置选择,文章链接如下:

【电脑组装】✈️从配置拼装到安装系统组装自己的台式电脑-CSDN博客

        这次继续更新平时开发时可能会使用到的常见技术,相信大家在开发时都会用到权限校验,通过此方式可以增强系统安全,比人使最常使用的校验工具就是JWT的token校验,就是通过后端服务器生成token,后续请求需要携带该参数进行校验;但是总会存在一部分接口不需要校验,但是就会面临接口被刷等问题 ,防刷接口也有很多解决方案,本地挑一个常见的 IP 限流,通过记录请求的所属地址,短时间内限制多次请求,这样可以实现简单的流量控制;

🍻一、实现方法

        这种实现方式有很多,就拿使用较多的 AOP 切面吧(因为最近了解到切面编程的另一种使用形式),在之前使用较多的方式是定义一个注解,在切面类中使用@Pointcut 标注刚自定义的注解,表示以下逻辑针对该注解起作用,然后在项目中需要使用的地方加上自定义注解即可;还有一种方式是鄙人最近在开发过程中淘到的,起因是要在原有的限流基础上改动一点逻辑,但是由于对项目的不熟悉,翻来翻去也没找到之前限流的入口(以为是自定义注解),最后在aop包下发现一个名字比较符合的类,LimitInterf...,点进去一看,很熟悉,就是切面类逻辑,但是又有一点不同,这里没有标明针对的注解,而是使用路径的方式来控制整个 controller 中的请求方法(怪不得请求层找不到相关注解)

🍺二、伪代码实现

        本地简单使用伪代码介绍下这种切面的实现方式,比较简单,看一下定义阶段即可;(为什么不展示完整实现并测试?因为鄙人最近在测试悟空,尤为过瘾不是...尤为紧迫,时间安排不过来...,醉翁之意不在酒,能ctrl C+V即可)

        代码结构如下:

        1.controller层请求进来后,首先获取该请求的路径,之后获取访问用户的ip,将请求路径拼接ip 作为唯一标识,到redis中查询访问次数,如果达到设置的上限,抛出异常提示已限制;如果是第一次访问,则设置相应的过期时间

        2.@Component 注解将当前类声明为组件,项目启动时会自动扫描

           @Aspect 注解是切面式编程中的重要注解,标明为切面逻辑类

        3.引入redis 作为分布式计数工具,用户每次访问都要记录并且将结果缓存到redis中,下次再访问时先进行是否达到限制

        4.注入Servlet工具,获取每次请求的具体路径,用来计数

        5. 

@Pointcut(value = "execution(* com.test.controller.app.*Controller*.*(..))")

这里是指包含test.controller 包下的所有以Controller结尾的类下的所有方法都需要经过该逻辑类校验(适用于统一管理下的切面实现,不用给每个请求方法上加注解)

@Component
@Aspect
@Slf4j
public class InterfaceLimitAspect {@Autowiredprivate RedissonClient redissonClient;@Autowiredprivate HttpServletRequest httpServletRequest;@Pointcut(value = "execution(* com.test.controller.app.*Controller*.*(..))")public void point() {}private final Integer INTERFACELIMITCOUNT = 10;private final Integer INTERFACELIMITTIME = 10;@Before("point()")public void before() {try {String servletPath = httpServletRequest.getServletPath();String ipAddr = IpUtil.getIpAddr(httpServletRequest);RAtomicLong atomicLong = redissonClient.getAtomicLong(servletPath + ":" + ipAddr);if (atomicLong.get() >= INTERFACELIMITCOUNT) {log.info("接口限流:{}", servletPath + ":" + ipAddr);throw new Exception("try later");} else {atomicLong.incrementAndGet();if (atomicLong.get() == 1) {atomicLong.expire(INTERFACELIMITTIME,TimeUnit.HOURS);}}} catch (Exception e) {log.error("接口限流异常", e);}}
}

🍹三、章末

        文章到这里就结束了~

相关文章:

【IP限流】⭐️通过切面实现无校验保护接口的防刷逻辑

目录 🍸前言 🍻一、实现方法 🍺二、伪代码实现 🍹三、章末 🍸前言 小伙伴们大家好,上次写了一篇文章记录了最近自己装台式电脑中遇到的问题,以及整体的安装步骤和本地的配置选择&#xff0c…...

SwiftUI简明概念(3):Path.addArc的clockwise方向问题

一、画个下半圆 SwiftUI中绘制下半圆的一个方法是使用Path.addArc,示例代码如下: var body: some View {Path { path inpath.addArc(center: CGPoint(x: 200, y: 370), radius: 50, startAngle: Angle(degrees: 0), endAngle: Angle(degrees: 180.0), …...

$attrs 和 $listeners

通常情况下,父子组件之间的数据是通过 props 由父向子传递的,当子组件想要修改数据时,则需要通过 $emit 以事件形式交由父组件完成,而这种交互方式只存在于父子组件之间,多层嵌套的时候,处于内层的组件想要…...

智尚招聘求职小程序V1.0.17

微信小程序招聘管理系统。支持多城市、人才版块、招聘会、职场资讯、经纪人入驻等功能。提供全部无加密源码,支持私有化部署。 V1.0.17增加功能 1、增加求职者投简历时检测简历状态功能 更新后无需重新发布前端...

C语言编程-经典易错题1

#include<stdio.h> int main(int argc, char const *argv[]) { unsigned int a6;int b-20; (ab>6)?puts("a>6"):puts("a<6"); return 0; } 这无符号整型问题的答案是输出是 >6 这个问题是考察C语言中整数自动转换原则。 具…...

联宇集团:如何利用CRM实现客户管理精细化与业务流程高效协同

在全球化的浪潮中&#xff0c;跨境电商正成为国际贸易的新引擎。作为领先的跨境电商物流综合服务商&#xff0c;广东联宇物流有限公司(以下称“联宇集团”)以其卓越的物流服务和前瞻的数字化战略&#xff0c;在全球市场中脱颖而出。本文将基于联宇集团搭建CRM系统的实际案例&am…...

如何排查 Windows 无法连接ubuntu远程服务器

当本机连接不上远程服务器&#xff0c;排查问题的思路是确保本机和远程的 sshd 服务都没有问题。 为什么要写这篇文章&#xff0c;一是记录防止忘记&#xff0c;另一方面是 gpt 给的方案太宽泛&#xff0c;需要自己逐一排查。而我们自己遇到的问题多半是有上下文的。这些上下文…...

Win10系统插入带有麦克风的耳机_麦克风不起作用_解决方法_亲测成功---Windows运维工作笔记054

今天我在使用讯飞输入法的时候,想通过讯飞的语音输入法来提高自己的输入效率。 但是这个时候发现一个问题就是我插入我的台式机的是一个带有麦克风的耳机。 但是发现我这个耳机没有办法被电脑识别出麦克风来,所以说就没办法使用讯飞输入法的语音输入功能来直接输入文字了。…...

个人文章汇总(Spring合集:Spring+Mvc+Boot+Cloud)

简述SSH框架和SSM框架的区别 简述Spring、SpringMvc和SpringBoot的区别 Spring&#xff1a;浅谈对Spring的认识 Spring&#xff1a;浅谈对AOP的认识 Spring&#xff1a;依赖注入(IOC)之注解注入 Spring&#xff1a;浅谈对SpringBean的认识 Spring&#xff1a;浅谈对Spring事务的…...

深入理解Java CompletableFuture多线程编排的最佳实践

1. 引言 1.1 多线程编排的必要性 在现代应用程序中&#xff0c;尤其是涉及网络请求、大数据处理或高并发场景时&#xff0c;多线程编排变得尤为重要。传统的顺序执行方式可能导致性能瓶颈&#xff0c;增加响应时间&#xff0c;从而影响用户体验和系统效率。通过多线程编排&am…...

人工智能与机器学习原理精解【29】

文章目录 多层感知机&#xff08;MLP, Multilayer Perceptron&#xff09;通用逼近定理&#xff08;Universal Approximation Theorem&#xff09;一、定义二、公式三、原理 MLP&#xff08;多层感知机&#xff0c;Multilayer Perceptron&#xff09;概述一、数学原理二、公式三…...

【Python】探索 Graphene:Python 中的 GraphQL 框架

人们常说挣多挣少都要开心&#xff0c;这话我相信&#xff0c;但是请问挣少了怎么开心&#xff1f; 随着现代 Web 应用对数据交互需求的不断增长&#xff0c;GraphQL 作为一种数据查询和操作语言&#xff0c;越来越受到开发者的青睐。Graphene 是 Python 语言中实现 GraphQL 的…...

Azure Data Box 80 TB 现已在中国区正式发布

我们非常高兴地宣布&#xff0c;Azure Data Box 80 TB SKU现已在 Azure 中国区正式发布。Azure Data Box 是 Azure 的离线数据传输解决方案&#xff0c;允许您以快速、经济且可靠的方式将 PB 级数据从 Azure 存储中导入或导出。通过硬件传输设备可加速数据的安全传输&#xff0…...

“表观组学分析:汇智生物的创新技术应用“

&#x1f331; 汇智生物 | 专注农业&植物基因组分析 &#x1f331; &#x1f393; 教授【优青】团队亲自指导&#xff01;提供专业实验设计、数据分析、SCI论文辅助等全方位服务。精准高效&#xff0c;为农植物科研保驾护航&#xff01; &#x1f52c; 专业实验外包服务&am…...

【web安全】——sql注入

1.MySQL基础 1.1information_schema数据库详解 简介&#xff1a; 在mysql5版本以后&#xff0c;为了方便管理&#xff0c;默认定义了information_schema数据库&#xff0c;用来存储数据库元数据信息。schemata(数据库名)、tables(表名tableschema)、columns(列名或字段名)。…...

vue基础面试题

1.Vue指令 v-bind&#xff1a;动态绑定数据 v-on&#xff1a;绑定事件监听器 v-for&#xff1a;循环指令&#xff0c;可以循环数组或对象 v-if&#xff1a;根据表达式的真假值&#xff0c;判断是否渲染元素&#xff0c;会销毁并重建 v-show&#xff1a;显示隐藏元素&#xff0…...

关系型数据库和非关系型数据库的区别

1.常见的主流数据库 关系型数据库&#xff1a; MySql 、达梦 、PostgreSQL 、Oracle 、Sql Server 、Sqlite非关系型数据库&#xff1a; Redis 、MongoDB 、HBase 、 Neo4J 、 CouchDB 2.介绍 关系型数据库最典型的数据结构是表&#xff0c;由二维表及其之间的联系…...

学习之什么是迭代器

什么是迭代器 迭代器的作用&#xff1a;访问容器中的元素 首先要了解什么是Iterablelterable(可迭代的) 字符串、列表、元组、字典都是lterable&#xff0c;都可以放到for循环语句中遍历 lterable类型的定义中一定有一个_iter_方法iter 方法必须返回一个lterator(迭代器) 可以…...

数据结构-3.6.队列的链式实现

队列可以理解为单链表的阉割版&#xff0c;相比单链表而言&#xff0c;队列只有在添加和删除元素上和单链表有区别 一.队列的链式实现&#xff1a; 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> ​ typedef struct LinkNode //链式队列结点 {int data;st…...

Java中去除字符串中的空格

在平时的开发中&#xff0c;在后端经常要获取前端传过来的字符串&#xff0c;有的是用户从输入框中输入的&#xff0c;有的是通过excel表格中获取的。 在这些字符串中&#xff0c;有时候会遇到字符串中有空格、换行符或者制表符&#xff0c;对于这种字符串来说&#xff0c;直接…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...