保洁阿姨
50+年前端设计经验
悠悠博客
usuuu.com
保洁阿姨
50+年前端设计经验
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FrequencyLimit {
// 频率限制时间,默认值为1分钟(60,000 毫秒)
long time() default 60000L;
// 频率限制数量,默认值为 5 次
int frequency() default 5;
}
@Aspect
@Component
public class FrequencyLimitAspect {
private static final Map<String, List<Long>> ACCESS_RECORD = new ConcurrentHashMap<>();
@Around("@annotation(limit)")
public Object around(ProceedingJoinPoint joinPoint, FrequencyLimit limit) throws Throwable {
//获取请求方法的名称和参数列表
String methodName = joinPoint.getSignature().toLongString();
Object[] args = joinPoint.getArgs();
//获取限制时间和数量
long time = limit.time();
int frequency = limit.frequency();
//检查是否已经超过频率限制
if (!checkAccessFrequency(methodName, time, frequency)) {
throw new RuntimeException("请求太频繁,请稍后再试");
}
//执行目标方法并返回结果
return joinPoint.proceed(args);
}
/**
* 检查访问频率是否超限
*
* @param methodName 请求方法的名称
* @param time 频率限制时间
* @param frequency 频率限制数量
* @return true 表示访问频率没有超过限制,false 表示访问频率超过限制
*/
private boolean checkAccessFrequency(String methodName, long time, int frequency) {
long now = System.currentTimeMillis();
List<Long> accessList = ACCESS_RECORD.get(methodName);
if (accessList == null) {
accessList = new ArrayList<>();
ACCESS_RECORD.put(methodName, accessList);
}
accessList.add(now);
while (!accessList.isEmpty() && now - accessList.get(0) > time) {
accessList.remove(0);
}
return accessList.size() <= frequency;
}
}
@FrequencyLimit(frequency = 5, time = 60000L)
@PostMapping("/update")
public R<?> update(@RequestBody ArticleBo articleBo) {
articleService.update(articleBo);
return R.ok(null, "修改成功");
}
站点公告
NoticeWeb前后端交流群:70888820
QQ号523179414(姓:郑)狗骗子,谢绝访问
热门文章
Host3139 次围观
3631 次围观
3879 次围观
1963 次围观
6666 次围观
4161 次围观
1854 次围观
1060 次围观