Spring Boot怎么利用拦截器加缓存完成接口防刷
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,小编给大家分享一下Spring Boot怎么利用拦截器加缓存完成接口防刷,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什
千家信息网最后更新 2025年11月13日Spring Boot怎么利用拦截器加缓存完成接口防刷
小编给大家分享一下Spring Boot怎么利用拦截器加缓存完成接口防刷,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
为什么需要接口防刷
为了减缓服务器压力,将服务器资源留待给有价值的请求,防止恶意访问,一般的程序都会有接口防刷设置,接下来介绍一种简单灵活的接口防刷操作
技术解析
主要采用的技术还是拦截+缓存,我们可以通过自定义注解,将需要防刷的接口给标记出来管理,利用缓存统计指定时间区间里,具体的某个ip访问某个接口的频率,如果超过某个阈值,就让他进一会儿小黑屋,到期自动解放
主要代码
前置环境搭建,Spring Boot项目,引入Web和Redis依赖
org.springframework.boot spring-boot-starter-parent 2.3.3.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter
自定义注解
定义拦截器,重写preHandler方法
@Override public boolean preHandle(HttpServletRequest request ,HttpServletResponse response ,Object handler) throws Exception { log.info("------------接口防刷拦截器---------------"); if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class); // 如果没有该注解,则不在防刷目标里,直接返回 if (accessLimit == null) { return true; } // 获取最大访问次数 int maxAccessCnt = accessLimit.maxAccessCnt(); // 获取ip String key = getRealIp(request); // ip+请求的接口路径 => 唯一标识key key += request.getRequestURI(); //当前访问次数 Object value = redisTemplate.opsForValue().get(key); if (value == null) { //第一次访问 设置key保留时长为1s redisTemplate.opsForValue().set(key, 1, 1L, TimeUnit.SECONDS); } else { Integer currentCnt = (Integer) value; if (currentCnt < maxAccessCnt) { //对应key值自增 redisTemplate.opsForValue().increment(key); } else { //超出接口时间段内允许访问的次数,直接返回错误信息,同时设置过期时间 20s自动剔除 redisTemplate.expire(key, 20L,TimeUnit.SECONDS); response.setContentType("application/json;charset=utf-8"); try { OutputStream out = response.getOutputStream(); out.write("访问次数已达上线!请稍后再访问".getBytes(StandardCharsets.UTF_8)); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } return false; } } } return true; }添加到需要防刷的接口上
/** * 返回不携带data的(成功例子) * @return */@AccessLimit@GetMapping("/getPaperS")public ApiResult getPaperInfoSuccess() { if (log.isInfoEnabled()) { log.info("收到获取paper信息请求..."); } //...业务逻辑 if (log.isInfoEnabled()) { log.info("完成获取paper信息请求,准备返回对象信息"); } return ApiResultGenerator.success();}测试结果
正常情况下

到底时间段内最大访问次数时
以上是"Spring Boot怎么利用拦截器加缓存完成接口防刷"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
接口
次数
缓存
拦截器
信息
时间
注解
篇文章
最大
内容
技术
时间段
服务器
服务
成功
接下来
不怎么
业务
代码
价值
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
游戏数据库管理系统
机电数据库
接受软件开发服务如何核算
服务器与网络通信设备
吴江区方便软件开发专业服务
数据库应用技术期末考试卷
明日之后的安卓服务器如何删除
移动软件开发技术难吗
五邑大学网络安全
程序员怎么打开数据库
数据库代理键联合主键
电视有网但是连不到服务器
网络安全性检测每年进行次
orcl数据库双机部署
武汉长沙国家网络安全中心
芜湖oa管理软件开发要多少钱
武汉丰之恒网络技术有限公司
网络安全技术应用实验报告
关系型数据库支持sql语言
麒麟v10国产数据库
数据库创建10个结点的链表
图章制作软件开发
手机跳出网络安全员 消息
五月八王者服务器为什么维护了
lol服务器怎么升级
北京安信通数据库安全扫描
网络安全我有责手抄报图片
医疗app软件开发哪家公司
网络运行状态网络安全事件
江汉区剧院票务系统软件开发