一个注解搞定 Spring Boot 接口防刷

一个注解搞定Spring Boot接口防刷 将一个用户的访问次数写到缓存里,同时给数据加有效期,次数增加直接对数据+1。接口限流防刷:防止用户大量重复访问,一分钟之内或几秒内限制访问多少次。如果在有效期内,数据超过某数值,访问返回失败。有效期过了,重新存入数据。 阅读详情

一,技术要点:Spring Boot的基本知识,Redis基本操作,

首先是写一个注解类:

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
 
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@Retention(RUNTIME)
@Target(METHOD)
public @interface AccessLimit {
 
    int seconds();
    int maxCount();
    boolean needLogin()default true;
}

接着就是在Interceptor拦截器中实现:

import com.alibaba.fastjson.JSON;
import com.example.demo.action.AccessLimit;
import com.example.demo.redis.RedisService;
import com.example.demo.result.CodeMsg;
import com.example.demo.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
 
@Component
public class FangshuaInterceptor extends HandlerInterceptorAdapter {
 
    @Autowired
    private RedisService redisService;
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 
        //判断请求是否属于方法的请求
        if(handler instanceof HandlerMethod){
 
            HandlerMethod hm = (HandlerMethod) handler;
 
            //获取方法中的注解,看是否有该注解
            AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);
            if(accessLimit == null){
                return true;
            }
            int seconds = accessLimit.seconds();
            int maxCount = accessLimit.maxCount();
            boolean login = accessLimit.needLogin();
            String key = request.getRequestURI();
            //如果需要登录
            if(login){
                //获取登录的session进行判断
                //.....
                key+=""+"1";  //这里假设用户是1,项目中是动态获取的userId
            }
 
            //从redis中获取用户访问的次数
            AccessKey ak = AccessKey.withExpire(seconds);
            Integer count = redisService.get(ak,key,Integer.class);
            if(count == null){
                //第一次访问
                redisService.set(ak,key,1);
            }else if(count < maxCount){
                //加1
                redisService.incr(ak,key);
            }else{
                //超出访问次数
                render(response,CodeMsg.ACCESS_LIMIT_REACHED); //这里的CodeMsg是一个返回参数
                return false;
            }
        }
 
        return true;
 
    }
    private void render(HttpServletResponse response, CodeMsg cm)throws Exception {
        response.setContentType("application/json;charset=UTF-8");
        OutputStream out = response.getOutputStream();
        String str  = JSON.toJSONString(Result.error(cm));
        out.write(str.getBytes("UTF-8"));
        out.flush();
        out.close();
    }
}

再把Interceptor注册到springboot中

import com.example.demo.ExceptionHander.FangshuaInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
 
    @Autowired
    private FangshuaInterceptor interceptor;
 
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(interceptor);
    }
}

接着在Controller中加入注解

import com.example.demo.result.Result;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
@Controller
public class FangshuaController {
 
    @AccessLimit(seconds=5, maxCount=5, needLogin=true)
    @RequestMapping("/fangshua")
    @ResponseBody
    public Result<String> fangshua(){
 
 
        return Result.success("请求成功");
 
    }
OpenHarness代码解读 Harness 是包裹在大模型之外、为其赋予完整执行能力的全套基础设施。模型负责提供智能与推理,Harness 则为模型提供感知、行动、记忆、工具与安全约束,使其从语言模型变成可自主完成复杂任务的实用智能体。我这里把向量数据库方案定义为:把对话片段、事件、偏好、工具结果等切成 memory chunks,做 embedding,存进向量库,查询时靠 ANN 相似度召回,再交给 LLM 读。AAAI 的综述类论文就明确指出,很多 LLM agent 的长期记忆就是这么做的。AAAI 期刊把文件系统方案。 阅读详情

相关推荐

Unity类银河战士恶魔城学习总结(P162 Improve skeleton提升敌人的效果)

为敌人添加了快慢刀

suzh1qian的博客 572

SpringBoot接口防刷(限制指定用户对指定接口指定时间范围内的访问次数)

在你请求的时候,服务器通过redis记录下你的请求次数,如果次数超出限制,则不给访问,在redis保存key是有时效性的,过期就会删除。这次我们使用 注解 拦截器 缓存 来实现这个功能。

liuerpeng1904的博客 4329

保姆级教程:从Navicat 11/12到15,平滑升级搞定MySQL 8.0的caching_sha2_password认证

本文提供从Navicat 11/12升级到15的保姆级教程,重点解决MySQL 8.0的caching_sha2_password认证问题。详细介绍了备份配置、新版本功能亮点、跨平台安装步骤、配置迁移流程以及高级使用技巧,帮助用户平滑过渡到Navicat 15,提升数据库管理效率。

weixin_33724046的博客 204

springboot 接口防刷(根据IP与路径限制)

根据ip和路径处理接口防刷,有全局方式 与 aop注解方式

qq_48721706的博客 3319

Gamma变换算法之Matlab&FPGA实现

Gamma映射原理 什么是Gamma曲线 人眼的感光与光强并不是呈线性关系的,而是呈非线性关系(指数型关系,如下图左-曲线。在低照度下,人眼更容易分辨出亮度的变化,随着照度的增加,人眼不易分辨出亮度的变化。而图像传感器与输入光强呈线性关系(如下图左-直线)。从图中可见,当传感器感光在20%左右时,人眼感光响应达到了50%,人眼对低照度的变化更为敏感。从下图右侧可见,Reference Tone为人眼感光50%的亮度,而传感器在感光50%时则相对暗的多(见Select,近似中性灰)。这种将原始图像通过映射操

CrazyBingo的博客 7407

torchsparse安装

torchsparse安装以及安装失败原因分析和解决

AI_BING_的博客 1万+

【SpringBoot】Spring Boot 如何实现接口防刷

SpringBoot接口防刷

低调做人,低调编码,神码都是浮云 3120

Python 爬虫教程:金融数据定向抓取(银行 + 投资网站数据结构化提取)

在当今数字化时代,金融数据的获取和分析对于投资者、分析师以及金融机构来说至关重要。Python 爬虫技术可以帮助我们高效地从各种网站上抓取金融数据,从而为投资决策、风险评估和市场分析提供支持。本文将详细介绍如何使用 Python 爬虫技术来定向抓取银行和投资网站的数据,并将其结构化提取,以便进一步分析和使用。

u014481728的博客 884

SpringBoot中设置接口防刷机制

接口防刷

qq_45968950的博客 1255

PVE虚拟机运行不流畅,出现卡顿。

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 3065

Day 01: 与Python的第一次亲密接触

环境搭建 、第一个程序 Hello, World!、以及Python之禅 (The Zen of Python) 的解读。

杨小扩的博客 220

springboot接口防刷实现

本文主要介绍一种通过实现自定义注解,实现一种比较通用的接口防刷方式

Terry Tian' coding Life 1817

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

一看就会!一个注解搞定 Spring Boot 接口防刷

一,技术要点:Spring Boot的基本知识,Redis基本操作, 首先是写一个注解类: importjava.lang.annotation.Retention; importjava.lang.annotation.Target; importstaticjava.lang.annotation.ElementType.METHOD; importstaticjava.lang.annotation.RetentionPolicy.RUNTIME; @Retention(RU...

JAVABBQWE的博客 145

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SpringBoot 接口防刷,一个注解搞定

说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考 一,技术要点:springboot的基本知识,redis基本操作, 首先是写一个注解类: import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.Rete

da297368860的博客 180

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一个注解搞定 SpringBoot 接口防刷,还有谁不会?

开发者(KaiFaX)面向全栈工程师的开发者专注于前端、Java/Python/Go/PHP的技术社区来源 | blog.youkuaiyun.com/weixin_42533856/article/...

AI研习社 136

一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!

kk-anti-reptile是一款专为SpringBoot设计的智能防爬组件,通过IP频率检测、UA识别等多维度规则防止恶意请求。核心特点包括:基于Redis实现分布式计数和锁、低侵入性集成、动态验证码防护等。只需简单配置即可保护关键接口,提供丰富的可调参数适应不同业务场景。该组件能有效解决资源耗尽、数据泄露等问题,相比传统限流方案更加精准智能,是SpringBoot项目防爬防刷的优选方案。

油墨香^-^的博客 197

六合一 Spring Boot API 防护框架:防重、限流、幂等、自动Trim、慢接口检测、链路追踪,一个 Starter 搞定

文章摘要 Guardian v1.5.0 是一个轻量级 Spring Boot 接口防护框架,新增参数自动 Trim、慢接口检测和请求链路追踪三大功能。目前共包含六个独立模块,覆盖 API 请求层常见防护需求。每个模块通过 Starter 方式引入,支持零配置快速启用。框架提供注解和 YAML 两种配置方式,包含防重复提交(支持用户/IP/全局维度)、接口限流(双算法)、接口幂等(Token机制)等核心功能。新版本增强了可观测性,通过 Actuator 端点提供运行指标,并支持自定义扩展点。项目已开源,提供

2604_95253941的博客 1130

给 Spring Boot 接口加了幂等保护:Token 机制 + 结果缓存,一个注解搞定

Spring Boot 接口幂等框架 Guardian 1.4.1 发布 Guardian 框架新增接口幂等模块,基于 Token 机制实现请求防重功能。通过 @Idempotent 注解可快速为接口添加幂等性保障,支持两种使用方式: Header 方式:通过请求头传递 Token Param 方式:支持 URL 参数、表单字段或 JSON Body 传递 Token 核心特性包括: 原子性 Token 消费(Redis/本地缓存) 结果缓存功能(重复请求返回首次结果) 灵活的 Token 传递方式 独立

2604_95253941的博客 652
上一篇: MyBatis Plus 为啥这么牛?
下一篇: 在国企当程序员是什么体验?
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值