主要是通過將請求次數存入redis 實現
注解
/**
* @author : ziyue
* @date : 2020-09-01 9:31
* @description :
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestLimit {
/**
* 請求次數
*/
int count() default 1;
/**
* 限制時間(秒)
*/
long time() default 5;
}
aop
/**
* 限制 一段時間可以請求的次數
* @param proceedingJoinPoint
* @param requestLimit
* @return
* @throws Throwable
*/
@Around(value = "@annotation(requestLimit)")
@ResponseBody
public Object requestLimit(ProceedingJoinPoint proceedingJoinPoint, RequestLimit requestLimit) throws Throwable {
ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String userId = TokenUtilApi.getUserId(request);
String methodName = proceedingJoinPoint.getSignature().getName();
StringBuffer redisKey = new StringBuffer();
redisKey.append("requestLimit:").append(methodName).append(":").append(userId);
Integer requestCount = (Integer) redisService.get(redisKey.toString());
requestCount=requestCount==null?0:requestCount;
Object proceed =null;
if(requestCount<requestLimit.count()){
redisService.put(redisKey.toString(),requestCount+1,requestLimit.time());
proceed = proceedingJoinPoint.proceed();
}else{
return ResultUtil.errorResponse(-1,"操作頻繁,請 "+redisService.getExpire(redisKey.toString())+" 秒后重試");
}
return proceed;
}