代码改变世界

springboot 重复提交





@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DuplicateSubmitToken {

String key() default "";
}





@Aspect
@Configuration
public class LockMethodAop {

private static final Cache<String, Object> CACHES = CacheBuilder.newBuilder()
// 最大缓存 100 个
.maximumSize(1000)
// 设置写缓存后 5 秒钟过期
.expireAfterWrite(1, TimeUnit.SECONDS)
.build();

@Autowired
HttpServletRequest request;

@Around("execution(* tz.lion.inv.manage.controller..*.*(..)) && @annotation(tz.lion.inv.manage.annotation.DuplicateSubmitToken)")
public Object interceptor(ProceedingJoinPoint pjp) {
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
DuplicateSubmitToken localLock = method.getAnnotation(DuplicateSubmitToken.class);
String key = localLock.key()+request.getSession().getId();
if (!StringUtils.isEmpty(key)) {
if (CACHES.getIfPresent(key) != null) {
throw new Exception(ErrorMsg.FORM_SUBMIT_REPEAT);
}
// 如果是第一次请求,就将 key 当前对象压入缓存中
CACHES.put(key, key);
}
try {
return pjp.proceed();
} catch (Throwable throwable) {
throw new RuntimeException("服务器异常");
} finally {
// CACHES.invalidate(key);
}
}
}

posted on 2020-12-29 11:03  Captain林  阅读(393)  评论(0编辑  收藏  举报

导航