@Aspect
@Component
public class RateLimitAndDuplicateSubmitAspect {
//存储提交时间的戳的map,用于限制提交频率
private ConcurrentHashMap<String, Long> submissionTimestamps = new ConcurrentHashMap<>();
@Around("execution(* 换成要限流方法的根路径(..)) && args(hostNumber)")
public Object handleGenerateCode(ProceedingJoinPoint joinPoint, String hostNumber) throws Throwable {
String methodName = joinPoint.getSignature().getName();
String key = methodName + "-" + hostNumber;
// 检查是否超过限流
if (isRateLimited(key)) {
return Result.error("操作过于频繁,请稍后重试。");
}
// 检查是否重复提交
if (isDuplicateSubmission(key)) {
return Result.error("请勿重复提交。");
}
// 执行原始方法
Object result = joinPoint.proceed();
// 记录提交时间戳,用于限流和防重复提交
recordSubmissionTimestamp(key);
return result;
}
// 判断是否超过限流
private boolean isRateLimited(String key) {
Long lastSubmissionTimestamp = submissionTimestamps.get(key);
long currentTime = System.currentTimeMillis();
return lastSubmissionTimestamp != null && currentTime - lastSubmissionTimestamp < 10000; // 限定1秒内只能提交一次
}
// 判断是否重复提交
private boolean isDuplicateSubmission(String key) {
return submissionTimestamps.containsKey(key);
}
// 记录提交时间戳
private void recordSubmissionTimestamp(String key) {
submissionTimestamps.put(key, System.currentTimeMillis());
}
}
APO请求限流一秒一次不重复
于 2024-01-04 09:39:33 首次发布