【接口防刷机制】
主要防止短时间接口被大量调用(攻击),出现系统崩溃和系统爬虫问题,提升服务的可用性。限制同一用户一定时间内(如1 min)只能访问固定次数,可以减少对业务的侵入,在服务端对系统做一层保护.
【实现方案】
本文主要是通过 自定义注解+redis+spring aop+全局异常的方式实现接口限流防刷功能。
自定义注解
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface RequestLimit {
/**
* 调用的次数
* @return
*/
int count() default 3;
/**
* 时间段; 在time内调用的次数count -单位秒
* @return
*/
int frameTime() default 1;
/**
* 锁定时间 -单位小时
* @return
*/
int lockTime() default 1;
}
spring AOP切面
@Slf4j
@Aspect
@Component
public class RequestLimitContract {
@Autowired
private TblUserService userService;
@Autowired
private TblBlackListService tblBlackListService;
@Autowired
private RedisClient redisClient;
//region 环绕通知
@Around("@annotation(limit)")
@Transactional(rollbackFor = Exception.class)
public Object requestLimit(ProceedingJoinPoint process, RequestLimit limit) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long