Java Spring Boot实现基于URL + IP访问频率限制
点击下载《Java Spring Boot实现基于URL + IP访问频率限制(源代码)》
1. 引言
在现代 Web 应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段。为了保护系统资源,防止服务器过载或服务不可用,需要对接口的访问频率进行限制。本文将介绍如何使用 Spring Boot 实现基于 URL 和 IP 的访问频率限制,具体步骤包括:
-
使用拦截器拦截请求:在每个请求到达控制器之前进行拦截。
-
使用 Redis 存储访问记录:利用 Redis 的高性能特性来存储每个 IP 对每个 URL 的访问次数。
-
检测访问频率:判断 IP 在一定时间内对特定 URL 的访问次数是否超过限制。
-
禁用恶意 IP:如果超过限制,则将 IP 列入黑名单,禁止其后续访问。
2. 项目依赖
首先,在 pom.xml 中添加必要的依赖,包括 Spring Boot Web、Spring Boot Starter Data Redis 和 Lombok(用于简化代码)。
<!-- Spring Boot Starter Data Redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.4.1</version>
</dependency><!-- Lombok (可选,用于简化代码) -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
3. 配置 Redis
在 application.properties 中配置 Redis 连接信息:
server.port=8080
# Redis 配置
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.database=0
# 可选:设置密码
# spring.data.redis.password=yourpassword
或在 application.yml 中配置Redis连接信息:
server:port: 8080spring:application:name: urlInterceptorDemodata:# redis 配置redis:# 地址host: 127.0.0.1# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password: "123456"# 连接超时时间timeout: 10s
4. 创建拦截器
创建一个拦截器 RateLimitInterceptor,用于拦截每个请求并执行访问频率限制逻辑。
package com.yyqq.urlinterceptordemo.Interceptor;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import java.util.concurrent.TimeUnit;@Component
public class RateLimitInterceptor implements HandlerInterceptor {@Autowiredpublic RedisTemplate redisTemplate;// 访问频率限制:每个 IP 每个 URL 最多访问 100 次 / 分钟private static final int MAX_REQUESTS = 10;private static final int TIME_WINDOW = 60; // 秒@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String ip = getClientIP(request);String url = request.getRequestURI();String key = "rate_limit:" + url + ":" + ip;long count = redisTemplate.opsForValue().increment(key, 1);if (count == 1) {// 设置键的过期时间为 TIME_WINDOW 秒redisTemplate.expire(key, TIME_WINDOW, TimeUnit.SECONDS);}if (count > MAX_REQUESTS) {response.setStatus(HttpServletResponse.SC_FORBIDDEN);response.setContentType("text/html;charset=UTF-8");response.getWriter().write("请求过于频繁,请稍后再试。");return false;}return true;}private String getClientIP(HttpServletRequest request) {String ip = request.getHeader("X-Forwarded-For");if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}
}
代码说明
- RedisTemplate:用于与 Redis 进行交互。
- MAX_REQUESTS 和 TIME_WINDOW:定义每个 IP 在每个 URL 上的最大访问次数和时间窗口(60 秒)。
- preHandle 方法:
- 获取客户端 IP 和请求的 URL。
- 构建 Redis 键,例如
rate_limit:/api/data:192.168.1.1。 - 使用
increment方法对键进行递增,并设置过期时间。 - 如果访问次数超过
MAX_REQUESTS,则返回 403 状态码,并返回错误信息。
- getClientIP 方法:获取客户端的真实 IP,处理代理和负载均衡的情况。
5. 注册拦截器
创建一个配置类 WebConfig,将拦截器注册到 Spring MVC 中。
package com.yyqq.urlinterceptordemo.config;import com.yyqq.urlinterceptordemo.Interceptor.RateLimitInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate RateLimitInterceptor rateLimitInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(rateLimitInterceptor).addPathPatterns("/**") // 拦截所有路径.excludePathPatterns("/error"); // 排除错误路径}
}
代码说明
- addInterceptors 方法:将自定义的拦截器添加到拦截器链中,并指定拦截的路径模式。
- addPathPatterns("/")**:拦截所有路径。
- excludePathPatterns(“/error”):排除错误路径,避免拦截器影响错误处理。
6. 创建控制器
创建一个简单的控制器 DemoController,包含一个示例接口用于测试。
package com.yyqq.urlinterceptordemo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class DemoController {@GetMapping("/getData")public String getData() {return "这是数据接口,现在访问正常!";}
}
8. 测试
启动 Spring Boot 应用后,可以进行以下测试:
1.正常访问:
-
访问
http://localhost:8080/test/getData,应返回 “这是数据接口,现在访问正常!”。 -
多次快速刷新,访问次数达到 10 次后,应返回 “请求过于频繁,请稍后再试。”,并返回 403 状态码。

2.禁用 IP:
-
在达到限制后,等待一段时间(60 秒),再次访问应恢复正常。

9. 总结
通过结合使用 Spring Boot 拦截器和 Redis,本文实现了一种基于 URL 和 IP 的访问频率限制机制。这种机制能够有效地防止接口被恶意刷新和暴力请求,保护系统资源,提高应用的安全性和稳定性。在实际应用中,可以根据具体需求调整访问频率限制的参数,如最大访问次数和时间窗口。此外,还可以结合其他安全措施,如 IP 黑名单、验证码等,进一步增强系统的防护能力。
点击下载《Java Spring Boot实现基于URL + IP访问频率限制(源代码)》
相关文章:
Java Spring Boot实现基于URL + IP访问频率限制
点击下载《Java Spring Boot实现基于URL IP访问频率限制(源代码)》 1. 引言 在现代 Web 应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段。为了保护系统资源,防止服务器过载或服务不可用,需要对接口的访问频率进行限制。本文将介绍如…...
C4D2025 win版本安装完无法打开,提示请将你的maxon App更新至最新版本,如何解决
最近安装C4D2025 win版本时,明明按步骤安装完成,结果打开提示提示请将你的maxon App更新至最新版本?遇到这种情况该如何解决呢。 一开始我的思路以为是旧版本没有删除干净,所以将电脑里有关maxon的软件插件都卸载了,重…...
微信小程序实现登录注册
文章目录 1. 官方文档教程2. 注册实现3. 登录实现4. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/路由跳转的几种方式: https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab…...
SpringBoot环境和Maven配置
SpringBoot环境和Maven配置 1. 环境准备2. Maven2.1 什么是Maven2.2 为什么要学 Maven2.3 创建一个 Maven项目2.4 Maven核心功能2.4.1 项目构建2.4.2 依赖管理2.4.3 Maven Help插件 2.5 Maven 仓库2.5.1本地仓库2.5.2 中央仓库2.5.3 私有服务器, 也称为私服 2.6 Maven设置国内源…...
大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术
联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…...
1.07 标准IO
1.思维导图 2.先编写以下结构体 struct Student { char name[20]; double math; double chinese; double english; double physical; double chemical; double…...
恒压恒流原边反馈控制芯片 CRE6289F
CRE6289F 系列产品是一款内置高压 MOS 功率开关管的高性能多模式原边控制的开关电源芯片。较少的外围元器件、较低的系统成本设计出高性能的交直流转换开关电源。CRE6289F 系列产品提供了极为全面和性能优异的智能化保护功能,包括逐周期过流保护、软启动、芯片过温保…...
Java中线程中断的几种方式,你了解吗?
Java中线程,可以使用 interrupt() 方法来实现线程的中断,那么,线程中中断的方式有几种呢?接下来,我们将介绍3种不同的线程中断方式,跟随我们的脚步,一起去看看! 目录 第一招…...
Tesseract5.4.0自定义LSTM训练
准备jTessBoxEditor,然后配置环境变量。 1、将图片转换成tif格式的,这里需要用画图工具另存为; 2、生成box文件 执行命令: tesseract agv.normal.exp1.tif agv.normal.exp1 -l eng --psm 6 batch.nochop makebox 关于box文件…...
centOS7
特殊权限 set_uid 赋予所有者身份 chmod us 文件 set_gid 赋予所有组身份 chmod gs 文件/目录 sticky_bit 防火墙 firewall-cmd 开启端口 firewall-cmd --zonepublic --add-port8080/tcp --permanent 重启防火墙 systemctl restart firewalld 查看开启的所有端口 fi…...
HTML5 弹跳动画(Bounce Animation)详解
HTML5 弹跳动画(Bounce Animation)详解 弹跳动画是一种动态效果,使元素在出现或消失时看起来像是在跳动。这种效果可以通过 CSS 动画或 JavaScript 来实现,增强用户体验。 1. 使用 CSS 实现弹跳动画 可以使用 CSS 的 keyframes…...
4.1.3 串
文章目录 串的基本概念串的基本操作串的存储结构 串的基本概念 串,仅由字符构成的有限序列。 串长:串中的字符个数。空串:长度为0的串。空格串:一个或多个空格构成的串。子串:串中任意长度连续字符构成的序列。含有字…...
国产编辑器EverEdit - 两种删除空白行的方法
1 使用技巧:删除空白行 1.1 应用场景 用户在编辑文档时,可能会遇到很多空白行需要删除的情况,比如从网页上拷贝文字,可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1: 使用编辑主菜单 选择主菜单编辑 …...
1月7日星期二今日早报简报微语报早读
1月7日星期二,农历腊月初八,早报#微语早读。 1、公安部:已为一线民警配备执法记录仪130万余部,规范现场执法; 2、浙江提出2035年全省域基本实现共同富裕; 3、“汕头牛肉丸”有新标准!1月6日起…...
随机置矩阵列为0[矩阵乘法pytorch版]
文章目录 1. 举例:2. python 代码 1. 举例: A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ] , r a n d [ 0 , 5 , 2 ] → A [ 0 1 0 3 4 0 6 7 0 9…...
C# 中mysql数据库,已经在原有数据库升级数据库脚本,去管理可以一次,和多次执行的,nuget包
在C#中,如果你需要管理数据库升级脚本,并且希望这些脚本能够支持一次执行和多次执行(即幂等性),你可以使用一些现成的NuGet包来简化这个过程。以下是一些常用的NuGet包: 1. DbUp 描述: DbUp 是一个轻量级…...
PCL 分段线性函数
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设我们有一个分段线性函数,并且我们希望在某个区间内对这个函数进行均匀采样,生成一系列的点。相对通用一些的思路就是对这个函数进行参数化,方法有很多,这在其他的博客中也有提到,不过PCL也为我们提供了一种…...
王静波页岩气:工厂蜕变的创业传奇
【小说】上世纪90年代,西部某工业园区的一家化工厂正面临着生存危机。厂里的锅炉设备老旧,煤炭价格飞涨,能源成本几乎压垮了生产线。王静波是这家工厂的技术主管,眼看工厂一天比一天萧条,他心里焦急万分,却…...
php反序列化 ctf例题演示 框架安全(TP,Yii,Laravel) phpggc生成框架利用pop
前言 php反序列化的框架的利用的pop是非常难写的 并且 我们不知道他的利用方法 所以PHPGGC是一个包含unserialize()有效载荷的库以及一个从命令行或以编程方式生成它们的工具。当在您没有代码的网站上遇到反序列化时,或者只是在尝试构建漏洞时,此工具…...
Koi技术教程-Tauri基础教程-第二节 Tauri的核心概念上
1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的,那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
