Spring Boot怎么利用拦截器加缓存完成接口防刷
发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,小编给大家分享一下Spring Boot怎么利用拦截器加缓存完成接口防刷,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什
千家信息网最后更新 2024年11月12日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安全错误
数据库的锁怎样保障安全
肇庆培训网络技术学校
华为认证网络技术教育中心
服务器A10卡
软件开发是不是要学习代码
水底数据库
干部数据库管理措施
瓜州网络安全教育局
文化部人才资料数据库宫一心
网络技术2.0教研计划
法度网络技术有限公司
SLA服务器
电子信息网络技术专业
网络安全密钥哪里打开
wind经济数据库学生
2008数据库是什么意思
软件开发及运维的区别
互联网和高科技行业区别
郑州正规软件开发价钱
黑龙江网络软件开发创新服务
墨子推演数据库设计
用户登陆服务器
何为代理服务器
大庆天气预报软件开发
水底数据库
山西晋州网络安全会议
网络安全为主题手抄报内容
棉花数据库搭建
关于网络安全的项目
漏洞网络安全
数据库可以直接插入数组