前言
自定义注解实现接口防刷案例,这个案例主要实现是通过AOP和自定义注解实现。在实际的开发中很多时候一些复杂重复的操作我们,我们都可以使用注解+AOP的方式进行实现。今天我们主要讲接口防刷,其他的之后在进行实现。
准备工作
首先在做这个案例之前,希望大家对自定义注解有一定的了解。同时也要对Aop有一定的认知。
自定义注解不熟悉的可以看一下我之前发的一篇文章。
啊啊,终于搞明白了,原来注解是这么一回事。6000+字理解注解【一】
这里我是用到了Spring boot+Redis来进行实现的,其实也可以不适用Redis。大家可以自己发掘一下。
环境的搭建这里就不做过多的赘述了,都应该会建工程。
AOP
面向切面编程,一般都是对现有的代码做一些其他操作。比如追加日志了等功能都可以使用AOP进行实现。
在springBoot中使用AOP需要引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.5.7</version>
</dependency>
下面我们粗略说下AOP 的几个注解:
注解 | 作用 |
---|---|
@Aspect(切面) | 通常是一个类,里面可以定义切入点和通知 |
@JointPoint(连接点) | 程序执行过程中明确的点,一般是方法的调用 |
@Advice(通知) | AOP在特定的切入点上执行的增强处理,有@before ,@after ,@afterReturning ,@afterThrowing ,@around |
@Pointcut(切入点) | 就是带有通知的连接点,在程序中主要体现为书写切入点表达式 |
这里不过多赘述AOP的知识。如有机会单独来讲AOP。
编写自定义注解
这里我们创建一个注解类,命名为RequestLimit
/**
* 自定义注解 限制访问
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
//最高优先级
@Order(1)
public @interface RequestLimit {
/*
* 允许访问的次数,默认值为max_value
* */
int count() default Integer.MAX_VALUE;
/*
* 以第一次请求往后退时间为准
* 例如第一次请求是在12:00点,请求时间设置一分钟
* 在12:01分的时间段内访问次数超过count会报错,但是到12:01之后会重新开始计数,而不是以后不可访问
* 时间段,单位为毫秒,默认值为一分钟
* 考虑到以上因素,如果知识为了避免攻击,建议把time设置大一点,例如一分钟20次
* 如果想要避免重复提交问题,需要且只能把Count设置成1,同时time设置小一点 例如一秒一次
*
* */
int time(