做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开发自定义注解实现对接口访问频次限制?相关推荐

  1. @requirespermissions注解是什么意思_如何基于spring开发自定义注解实现对接口访问频次限制?...

    做JavaWeb的开发的同学们都应该遇到过,客户要求某个接口进行频次的限制,如每秒并发10个,或者短信验证码发送场景,60秒内只允许发送一次. 通常开发的小伙伴们肯定是拿到以上需求在接口逻辑里进行实现 ...

  2. 基于Spring开发的DUBBO服务接口测试

    基于Spring开发的DUBBO服务接口测试 知识共享主要内容: 1. Dubbo相关概念和架构,以及dubbo服务程序开发步骤. 2. 基于Spring开发框架的dubbo服务接口测试相关配置. 3 ...

  3. spring使用自定义注解_用Spring组成自定义注释

    spring使用自定义注解 Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本 ...

  4. springboot记录用户访问次数_SpringBoot中自定义注解实现控制器访问次数限制示例...

    今天给大伙介绍一下SpringBoot中如何自定义注解实现控制器访问次数限制. 在Web中最经常发生的就是利用恶性URL访问刷爆服务器之类的攻击,今天我就给大伙介绍一下如何利用自定义注解实现这类攻击的 ...

  5. php中引入shiro,基于shiro的自定义注解的扩展-图文详解

    基于shiro的自定义注解的扩展 这里我们主要采取了shiro的自定义注解的方案.本篇文章主要解决以下的问题.如何通过逻辑进行页面与api接口的关联. shiro的自身注解的用法. 如何编写自定义注解 ...

  6. spring中自定义注解(annotation)与AOP中获取注解___使用aspectj的@Around注解实现用户操作和操作结果日志

    spring中自定义注解(annotation)与AOP中获取注解 一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. packag ...

  7. java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用

    Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...

  8. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  9. spring 扫描自定义注解

    目录 一:定义自定义注解 二:使用自定义注解 3.1 定义使用注解的测试文件路径 3.2继承BeanPostProcessor增加spring扫描配置 四:测试 目录结构: 一:定义自定义注解 pac ...

最新文章

  1. 利用PCHunter结束各种进程
  2. Thymeleaf相关补充
  3. UIActionSheet 多项弹出框
  4. 案例解释图像傅里叶变换的幅度谱和相位谱的以及反变换
  5. 履带式机器人与轮式机器人的异同分析
  6. Duplicate class com.blankj.utilcode.BuildConfig found in modules classes.jar
  7. 利用PyCharm进行Python远程调试
  8. 趋势OFFICESCAN忘记卸载密码时如何卸载客户端
  9. IAST与RASP精选文章汇总
  10. IEEE2020-IJON: Exploring Deep State Spaces via Fuzzing
  11. 皮肤暗的女孩如何穿衣服
  12. ps修改图片上文字的几种方法 图+文
  13. 地图作业平台低代码实战(搭建能力提升)
  14. 鼠眼看Linux调度器 by raise_sail @ chinaunix
  15. 单反相机镜头焦距与被摄物体的实际距
  16. 常见的百度云搜索引擎入口合集
  17. KConfig、Makefile详解以及ARM平台Linux内核的编译
  18. 程序设计c语言复试,c语言面试编程题
  19. 什么是云效,云原生时代一站式DevOps平台
  20. Word排版之段落样式+如何创建一个三线表外观的表格样式

热门文章

  1. nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
  2. C#序列化与反序列化方式简单总结
  3. 浅谈第三方电子支付平台测试方法的研究
  4. MyEclipse用(JDBC)连接SQL出现的问题~
  5. Microsoft Data Access Components(MDAC) 结构以及一些连接SQL数据库的架构基础
  6. Hyper-V实战:高可用性-配置Hyper-V群集
  7. java实例_Java线程方式及实例
  8. 基于Bokeh库,手把手教你制作“子弹图“和“瀑布图“!
  9. leetcode同样的代码 网上结果和本地结果不一样_Leetcode #263
  10. 在计算机中添加用户名和密码是多少,在win7系统中添加网络打印机提示输入用户名和密码的解决方案...