接口访问次数_如何基于spring开发自定义注解实现对接口访问频次限制?
做JavaWeb的开发的同学们都应该遇到过,客户要求某个接口进行频次的限制,如每秒并发10个,或者短信验证码发送场景,60秒内只允许发送一次。
通常开发的小伙伴们肯定是拿到以上需求在接口逻辑里进行实现,噼里啪啦一顿输出,OK搞定了,很简单。的确,这些需求比较简单,但是,有没有想过,这种频次限制其实是和业务耦合度不高,能不能统一封装,在业务需要的时候直接设置就行了呢?
答案是肯定的。自定义注解来实现就非常的方便,对你的业务接口增加自定义注解,无需修改业务代码即可快速按需完成想要的功能。
第一步:当然是定义一个自定义注解,如RateLimit
定义一个自定义注解RateLimit应用在方法或者类上,并定义相关关键字段,参数Key、频次数、时间、错误提示等。意思就是,在多少时间内,根据参数Key获取的值为判断依据,允许多少频次数的访问,如果超过,那么提示错误提示语,并拒绝访问。
第二步:实现HandlerInterceptor自定义一个拦截器
在拦截器里重写preHandle,将Object handler转换成HandlerMethod类型传递给自定义的securityManager处理,小伙伴也可以在这个地方直接实现,直接实现代码就不是显得那么高大上了。
第三步:核心处理逻辑
核心处理方法为handle方法,专门处理类RateLimitHandler。该方法,获取到方法上的注解类RateLimit,并获取到注解类里的关键信息:key()、fromHead()。fromHead为true表示从请求头根据key值获取对应的value值作为唯一标识uuid,否则直接从请求参数里根据key获取唯一标识。获取唯一标识后,调用validateRate方法进行校验是否超过频次,传入uuid,时间、时间单元,当前请求对象。
校验方法,首先根据uuid生成一个内部key,用于区分不同业务,cacheHandler是一个缓存实现,本例中,cacheHandler其实注入的是redis实例,也可以是内存实例。调用cacheHandler自增方法返回一个值,为什么要用自增,是因为考虑并发情况,不能先get再set。如果为1,表示第一次访问,设置一个失效时间,即注解定义的多少时间内,在这个时间过后,自动失效。
最后判断次数是否超过注解类定义的频次数,如果超过,返回false,否则,返回true。到此,自定义注解的实现就结束了。大家疑惑,如果使用起来呢。
第四步:使用,如:60秒内,只允许请求一次(哈哈哈短信验证码使用场景)
OK,就是这么简单,后续有其他相似的业务只需加这个注解,修改不同的时间、限制次数就可以。
接口访问次数_如何基于spring开发自定义注解实现对接口访问频次限制?相关推荐
- @requirespermissions注解是什么意思_如何基于spring开发自定义注解实现对接口访问频次限制?...
做JavaWeb的开发的同学们都应该遇到过,客户要求某个接口进行频次的限制,如每秒并发10个,或者短信验证码发送场景,60秒内只允许发送一次. 通常开发的小伙伴们肯定是拿到以上需求在接口逻辑里进行实现 ...
- 基于Spring开发的DUBBO服务接口测试
基于Spring开发的DUBBO服务接口测试 知识共享主要内容: 1. Dubbo相关概念和架构,以及dubbo服务程序开发步骤. 2. 基于Spring开发框架的dubbo服务接口测试相关配置. 3 ...
- spring使用自定义注解_用Spring组成自定义注释
spring使用自定义注解 Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本 ...
- springboot记录用户访问次数_SpringBoot中自定义注解实现控制器访问次数限制示例...
今天给大伙介绍一下SpringBoot中如何自定义注解实现控制器访问次数限制. 在Web中最经常发生的就是利用恶性URL访问刷爆服务器之类的攻击,今天我就给大伙介绍一下如何利用自定义注解实现这类攻击的 ...
- php中引入shiro,基于shiro的自定义注解的扩展-图文详解
基于shiro的自定义注解的扩展 这里我们主要采取了shiro的自定义注解的方案.本篇文章主要解决以下的问题.如何通过逻辑进行页面与api接口的关联. shiro的自身注解的用法. 如何编写自定义注解 ...
- spring中自定义注解(annotation)与AOP中获取注解___使用aspectj的@Around注解实现用户操作和操作结果日志
spring中自定义注解(annotation)与AOP中获取注解 一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. packag ...
- java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用
Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...
- spring AOP自定义注解方式实现日志管理
转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...
- spring 扫描自定义注解
目录 一:定义自定义注解 二:使用自定义注解 3.1 定义使用注解的测试文件路径 3.2继承BeanPostProcessor增加spring扫描配置 四:测试 目录结构: 一:定义自定义注解 pac ...
最新文章
- 利用PCHunter结束各种进程
- Thymeleaf相关补充
- UIActionSheet 多项弹出框
- 案例解释图像傅里叶变换的幅度谱和相位谱的以及反变换
- 履带式机器人与轮式机器人的异同分析
- Duplicate class com.blankj.utilcode.BuildConfig found in modules classes.jar
- 利用PyCharm进行Python远程调试
- 趋势OFFICESCAN忘记卸载密码时如何卸载客户端
- IAST与RASP精选文章汇总
- IEEE2020-IJON: Exploring Deep State Spaces via Fuzzing
- 皮肤暗的女孩如何穿衣服
- ps修改图片上文字的几种方法 图+文
- 地图作业平台低代码实战(搭建能力提升)
- 鼠眼看Linux调度器 by raise_sail @ chinaunix
- 单反相机镜头焦距与被摄物体的实际距
- 常见的百度云搜索引擎入口合集
- KConfig、Makefile详解以及ARM平台Linux内核的编译
- 程序设计c语言复试,c语言面试编程题
- 什么是云效,云原生时代一站式DevOps平台
- Word排版之段落样式+如何创建一个三线表外观的表格样式
热门文章
- nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
- C#序列化与反序列化方式简单总结
- 浅谈第三方电子支付平台测试方法的研究
- MyEclipse用(JDBC)连接SQL出现的问题~
- Microsoft Data Access Components(MDAC) 结构以及一些连接SQL数据库的架构基础
- Hyper-V实战:高可用性-配置Hyper-V群集
- java实例_Java线程方式及实例
- 基于Bokeh库,手把手教你制作“子弹图“和“瀑布图“!
- leetcode同样的代码 网上结果和本地结果不一样_Leetcode #263
- 在计算机中添加用户名和密码是多少,在win7系统中添加网络打印机提示输入用户名和密码的解决方案...