描述:
@RequestLimit(time=3)防重复点击,限制单个会话的请求频率。但是
@RequestLimit注解中的参数不能传常量。
例如:不能通过获取application.yml文件中的配置信息,去动态配置限制时间,所以就对@RequestLimit注解封装。
- 在application.yml配置文件中添加防止重复点击限制时长。
# 后端防重复点击时间
requestLimitTime: 3 # 时间限制值 3秒
- 自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/**1. 定义注解名称为:RequestLimit*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequestLimit { /*** 限制时间(秒),默认值为1秒*/long time() default 1;
}
- 注解切面业务逻辑自行添加
import com.dsy.cloud.bdss.platform.entity.RequestLimitMap;
import com.dsy.cloud.bdss.platform.exception.BusiException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Aspect
@Component
public class RequestLimitAspect {@Value("${requestLimitTime:}")private long limitTime; // 从application.yml配置文件中获取时间限制值,单位秒// 对带有@RequestLimit注解的方法进行处理(备注:@annotation中注解名要和自定义的注解名对应)。@Around("@annotation(RequestLimit)")public Object limitRequestExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {// 自行添加相关的业务逻辑...// 执行切点方法return joinPoint.proceed();}
}
- 在controller层使用注解
@PutMapping("/test")@RequestLimitpublic void test() throws Exception {// .....}