本文通过自定义注解+AOP+Redis实现防止接口重复提交(只需三步)
- 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface PreventDuplicateSubmissions {
long expire() default 1;
}
- 配置redis工具类方法
public Long incr(String key, long liveTime) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long increment = entityIdCounter.getAndIncrement();
if ((null == increment || increment == 0) && liveTime > 0) {
entityIdCounter.expire(liveTime, TimeUnit.SECONDS);
}
return increment;
}
- 配置AOP拦截
@Slf4j
@Aspect
@Component
public class PreventDuplicateSubmissionsInterceptor {
@Autowired
private Cache cache;
@Before("@annotation(preventDuplicateSubmissions)")
public void interceptor(PreventDuplicateSubmissions preventDuplicateSubmissions){
try {
Long count = cache.incr(getParams(), preventDuplicateSubmissions.expire());
if (count.longValue() >= preventDuplicateSubmissions.expire()){
log.error("访问过于频繁,请稍后再试");
}
}catch (Exception e){
log.error("请求异常:", e);
}
}
public String getParams(){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return request.getRequestURI();
}
}
- 在需要防止重复提交的接口上添加该注解即可
@PreventDuplicateSubmissions
@RequestMapping(value = "/putMessageObject")
public String putMessageObject(){
User user = new User("阿哲", 22);
rocketMQTemplate.convertAndSend("test-topic", user);
return "rocketmq-producer";
}
- 连续请求两次接口
2022-09-27 16:36:58.393 INFO 22024 --- [ main] c.producer.RocketmqProducerApplication : Started RocketmqProducerApplication in 2.834 seconds (JVM running for 3.473)
2022-09-27 16:37:24.373 INFO 22024 --- [nio-8090-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-09-27 16:37:24.373 INFO 22024 --- [nio-8090-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2022-09-27 16:37:24.373 INFO 22024 --- [nio-8090-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms
2022-09-27 16:37:30.856 ERROR 22024 --- [nio-8090-exec-3] c.PreventDuplicateSubmissionsInterceptor : 访问过于频繁,请稍后再试