【注解】超简单轻松实现接口超频防刷
目的:限制用户在一段时间内调用接口次数
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 如果在有效 ...
- java 接口防刷_java轻量级接口限流/防刷插件
简介 call-limit提供接口限流.防刷的功能,插件基于spring开发,在应用应用的任何一个逻辑层皆可使用(web.service.dao), 插件支持单机应用下的限流和分布式应用的限流(分布式 ...
- 超简单轻松的vim教程 —— 初窥vim
一直想写一份vim教程,帮助初学者少走弯路,使初学者能够更快地熟悉vim并爱上它. 这份教程会涵盖的内容如下 基本编辑方式 更快的移动与定位文本 文本搜索与替换 寄存器和宏 命令与批处理 组合键实战( ...
- linux下eclipse进行ndk调试,超简单,写的超清晰
转自:http://blog.linguofeng.com/archive/2013/04/18/eclipse-android-ndk-debug.html 注意: 1. 作者是在MAC os上面使 ...
- 自定义注解和拦截器,实现接口限流防刷
我们的目的是在指定时间内,每个用户只能进行秒杀请求指定次数. 首先,定义一个注解 写一个拦截器.就是当执行某个方法之前,将请求截获: (这里实现的只是一个思路,由于StringRedisTemplat ...
- 优雅的接口防刷处理方案
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...
- Redis限流接口防刷
Redis限流接口防刷 Redis 除了做缓存,还能干很多很多事情:分布式锁.限流.处理请求接口幂等性...太多太多了- 大家好,我是llp,许久没有写博客了,今天就针对Redis实现接口限流做个记录 ...
- 【多屏协同办公,无系统限制】超简单!手机电脑互投屏,手机/电脑投TV怎么搞?三个免费软件轻松搞定!(无手机、电脑系统限制~)
超简单!手机电脑互投屏,手机/电脑投TV怎么搞?三个免费软件轻松搞定!(无手机.电脑系统限制~) 一.手机电脑投TV-乐播投屏(同时也在研发手机投电脑的需求,即将上线) 二.手机WiFi/数据线投电脑 ...
- android手机投影电视软件,Type-C手机投屏电视/投影仪超简单,快看你的可以吗?...
原标题:Type-C手机投屏电视/投影仪超简单,快看你的可以吗? 在智能手机普及之前,大家的娱乐主要还是看电视,或者用电脑上网.玩游戏,而现在大家最离不开的就是手机.但是教授也发现一个现象,很多机友对 ...
最新文章
- memmove函数使用时注意的问题
- leetcode 打印_LeetCode第118号问题:杨辉三角
- Struts2 自定义拦截器(方法拦截器)
- [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?
- python中if __name__ == __main__的解释
- librtmp分析(接收数据包处理)
- [Python2.x] 标准库 urllib2 的使用细节
- Kunpeng BoostKit 使能套件:大数据场景如何实现“大鹏一日同风起”倍级性能提升?
- 剪板机自动上下料_江苏弗迈斯桁架机械手自动上下料
- 使用js获取页面参数
- Linux 下设置java环境和tomcat安装
- asp 环境配置到mysql数据库增删改查
- Spring实战(第5版)核心知识点总结
- 软件测试过程与方法_第4周单元测试
- Windows server 2016 安装sql server
- 前端系列第10集-实战篇
- 运动耳机怎么选,盘点目前适合运动的几款耳机
- Bridging signals(最长上升子序列)
- 算法提高 盾神与积木游戏
- 取消检验批过账(取消检验批UD判定到Rerel,再把非限性库存转到质检库存,然后就可以取101收货了)