目的:限制用户在一段时间内调用接口次数

1、自定义注解类

/*** 接口防刷注解* @Author: wwwppp* @Date: 2021-3-19 17:17*/
@Retention(RUNTIME)
@Target(METHOD)
public @interface AccessLimit {int seconds();//时间int maxCount();//该时间内最大请求次数boolean needLogin() default true;//是否需要登录}

2、拦截器中实现

/*** @Author: wwwppp* @Date: 2021-3-19 17:26*/
@Component
public class FangshuaInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate RedisUtil redisUtil;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//判断请求是否属于方法的请求if (handler instanceof HandlerMethod) {HandlerMethod hm = (HandlerMethod) handler;//获取方法中的注解AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);String userId = request.getParameter("id");//用户idif (accessLimit == null) {return true;}int seconds = accessLimit.seconds();int maxCount = accessLimit.maxCount();boolean needLogin = accessLimit.needLogin();String key = request.getRequestURI();//如果需要登录if (needLogin) {//获取登录的session进行操作key = "fangshua_userId_" + userId;//这里假设用户是1,项目中是动态获取的userId//从redis中获取用户访问的次数int userCount = redisUtil.get(key) == null  ? 0 : Integer.valueOf(redisUtil.get(key));if (userCount == 0) {//第一次访问redisUtil.setWithExpireTime(key, userCount+1+"", seconds);} else if (userCount < maxCount) {redisUtil.incr(key);//访问次数+1} else {//超频render(response, "接口调用超频,请稍后再试!"); //这里的CodeMsg是一个返回参数return false;}}}return true;}private void render(HttpServletResponse response, String msg) throws Exception {response.setContentType("application/json;charset=UTF-8");OutputStream out = response.getOutputStream();String str = JSON.toJSONString(JsonResult.failure(msg));out.write(str.getBytes("UTF-8"));out.flush();out.close();}

3、把Interceptor注册到springboot中

/*** @Author: wwwppp* @Date: 2021-3-19 17:51*/
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate FangshuaInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor);}}

4、在Controller中加入注解

@Controller
@RequestMapping("/test")
@Slf4j
public class TestCtrl extends BaseCtrl {@RequestMapping("/fangshua")@ResponseBody@AccessLimit(seconds = 60, maxCount = 5,needLogin = true)public JsonResult fangshua(@RequestParam(value = "id",required = true) String id){return JsonResult.success("OK");}}

测试

用idea插件请求

点击频繁则会报错

【注解】超简单轻松实现接口超频防刷相关推荐

  1. 十七、安全优化(拦截器实现接口限流防刷)

    接口限流防刷 防止用户大量重复访问,一分钟之内或几秒钟内限制访问多少次 思路:对接口做限流,计时,并记录访问次数 将一个用户的访问次数写到缓存里,同时给数据加有效期,次数增加直接对数据+1 如果在有效 ...

  2. java 接口防刷_java轻量级接口限流/防刷插件

    简介 call-limit提供接口限流.防刷的功能,插件基于spring开发,在应用应用的任何一个逻辑层皆可使用(web.service.dao), 插件支持单机应用下的限流和分布式应用的限流(分布式 ...

  3. 超简单轻松的vim教程 —— 初窥vim

    一直想写一份vim教程,帮助初学者少走弯路,使初学者能够更快地熟悉vim并爱上它. 这份教程会涵盖的内容如下 基本编辑方式 更快的移动与定位文本 文本搜索与替换 寄存器和宏 命令与批处理 组合键实战( ...

  4. linux下eclipse进行ndk调试,超简单,写的超清晰

    转自:http://blog.linguofeng.com/archive/2013/04/18/eclipse-android-ndk-debug.html 注意: 1. 作者是在MAC os上面使 ...

  5. 自定义注解和拦截器,实现接口限流防刷

    我们的目的是在指定时间内,每个用户只能进行秒杀请求指定次数. 首先,定义一个注解 写一个拦截器.就是当执行某个方法之前,将请求截获: (这里实现的只是一个思路,由于StringRedisTemplat ...

  6. 优雅的接口防刷处理方案

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  7. Redis限流接口防刷

    Redis限流接口防刷 Redis 除了做缓存,还能干很多很多事情:分布式锁.限流.处理请求接口幂等性...太多太多了- 大家好,我是llp,许久没有写博客了,今天就针对Redis实现接口限流做个记录 ...

  8. 【多屏协同办公,无系统限制】超简单!手机电脑互投屏,手机/电脑投TV怎么搞?三个免费软件轻松搞定!(无手机、电脑系统限制~)

    超简单!手机电脑互投屏,手机/电脑投TV怎么搞?三个免费软件轻松搞定!(无手机.电脑系统限制~) 一.手机电脑投TV-乐播投屏(同时也在研发手机投电脑的需求,即将上线) 二.手机WiFi/数据线投电脑 ...

  9. android手机投影电视软件,Type-C手机投屏电视/投影仪超简单,快看你的可以吗?...

    原标题:Type-C手机投屏电视/投影仪超简单,快看你的可以吗? 在智能手机普及之前,大家的娱乐主要还是看电视,或者用电脑上网.玩游戏,而现在大家最离不开的就是手机.但是教授也发现一个现象,很多机友对 ...

最新文章

  1. memmove函数使用时注意的问题
  2. leetcode 打印_LeetCode第118号问题:杨辉三角
  3. Struts2 自定义拦截器(方法拦截器)
  4. [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?
  5. python中if __name__ == __main__的解释
  6. librtmp分析(接收数据包处理)
  7. [Python2.x] 标准库 urllib2 的使用细节
  8. Kunpeng BoostKit 使能套件:大数据场景如何实现“大鹏一日同风起”倍级性能提升?
  9. 剪板机自动上下料_江苏弗迈斯桁架机械手自动上下料
  10. 使用js获取页面参数
  11. Linux 下设置java环境和tomcat安装
  12. asp 环境配置到mysql数据库增删改查
  13. Spring实战(第5版)核心知识点总结
  14. 软件测试过程与方法_第4周单元测试
  15. Windows server 2016 安装sql server
  16. 前端系列第10集-实战篇
  17. 运动耳机怎么选,盘点目前适合运动的几款耳机
  18. Bridging signals(最长上升子序列)
  19. 算法提高 盾神与积木游戏
  20. 取消检验批过账(取消检验批UD判定到Rerel,再把非限性库存转到质检库存,然后就可以取101收货了)

热门文章

  1. 强大的开发工具 pry
  2. 学生作业形同虚设!ChatGPT作弊成风!OpenAI:正在自研审核工具
  3. Heritrix源码分析(二) 配置文件order.xml介绍(转)
  4. 短视频素材怎么下载?
  5. java-net-php-python-ssm服装厂管理系统计算机毕业设计程序
  6. Win32 OpenGL编程 5 顶点数组详细介绍
  7. 和 Geoffery Hinton 面对面聊聊
  8. TDengine 签约航天五院,助力航天事业信息化
  9. 转:基于Turbo C2.0 的动画设计的例子
  10. linux 下安装好的软件打包,关于打包软件的安装