SpringBoot项目中自定义注解实现基于AOP的防止重复提交
在Spring Boot项目中,你可以使用AOP(面向切面编程)来实现防止表单重复提交的功能。以下是一个简单的例子:
首先,创建一个自定义注解PreventDuplicateSubmission
:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PreventDasubmit {
long timeout() default 10000; // 默认超时时间为10秒
}
然后,创建一个切面类来处理这个注解:
@Aspect
@Component
public class PreventDuplicateSubmissionAspect {
private final Map<String, Long> submissionTimestamps = new ConcurrentHashMap<>();
@Around("@annotation(PreventDuplicateSubmission)")
public Object aroundAdvice(ProceedingJoinPoint joinPoint, PreventDuplicateSubmission annotation) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
String key = method.getName() + "-" + joinPoint.getArgs(); // 生成key
long timestamp = System.currentTimeMillis();
Long lastSubmissionTimestamp = submissionTimestamps.get(key);
if (lastSubmissionTimestamp != null && timestamp - lastSubmissionTimestamp < annotation.timeout()) {
// 如果在指定的时间内已有提交,则拒绝继续提交
throw new RuntimeException("Duplicate submission detected. Please try again later.");
}
submissionTimestamps.put(key, timestamp); // 记录提交时间戳
try {
return joinPoint.proceed(); // 继续执行方法
} finally {
submissionTimestamps.remove(key); // 提交完毕后移除key
}
}
}
最后,在你的控制器方法上使用@PreventDuplicateSubmission
注解:
@RestController
public class MyController {
@PostMapping("/submit")
@PreventDuplicateSubmission(timeout = 30000) // 设置超时时间为30秒
public String submitForm(@Valid MyForm form) {
// 处理提交逻辑
return "Form submitted successfully";
}
}
这样,每当有客户端尝试在指定的时间内重复提交时,就会抛出异常,从而防止了重复提交。你可以根据需要调整超时时间和其他逻辑。
评论已关闭