Spring Boot怎么利用拦截器加缓存完成接口防刷
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,小编给大家分享一下Spring Boot怎么利用拦截器加缓存完成接口防刷,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什
千家信息网最后更新 2025年01月22日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安全错误
数据库的锁怎样保障安全
普陀区网络技术服务售后保障
软件开发工作需要汇报工作吗
vb 连接远程数据库
四级网络技术
最土团购 数据库
软件开发应用最广泛的模型
粉笔字体软件开发
搜企网络技术有限公司
苹果12看天气显示服务器出错
网络安全白无常
打印服务器和局域网共享哪个稳定
一点网络游戏服务器
社会工程数据库怎么访问
网络安全适用的法律法规
数据库如何附加ldf文件
云服务器连接软件
查看数据库表的大小
饥荒steam找不到好友服务器
t220服务器
数据库视图存储在哪里
小度服务器武打片
如果更高的网络技术浸入银行
2b2t用的什么服务器
分公司之间的网络安全设计
linux远程登录服务器
广西南宁雄翼网络技术
我的世界 服务器 破解
海东软件开发网上价格
一个学校有一个服务器么
oracle数据库岗位有