利用 springboot + redis 实现过滤重复提交的请求,业务流程如下所示,首先定义一个拦截器,拦截需要进行过滤的URL,然后用 session + URL 作为唯一 key,利用 redis setnx 命令,来判断请求是否重复,如果 key set 成功,说明非重复请求,失败则说明重复请求;
URL 拦截器可以使用 spring 拦截器,但使用 spring,每个需要过滤的新 URL 都需要添加配置,因此这里使用 AOP 注解 的形式来实现,这样更直观一点;
首先,定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.METHOD, ElementType.TYPE})
public @interface AvoidRepeatRequest {
/** 请求间隔时间,单位秒,该时间范围内的请求为重复请求 */
int intervalTime() default 5;
/** 返回的提示信息 */
String msg() default "请不要频繁重复请求!";
}
然后定义 AOP,实现重复请求过滤功能:
@Component