zoukankan      html  css  js  c++  java
  • 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);
    }
    }
    }
  • 相关阅读:
    你所不知道的 C# 中的细节
    数据分析与数据挖掘 ---- 系列教程
    Tiny Core Linux 安装配置
    Debian 安装
    基于C#的内网穿透学习笔记(附源码)
    Layui前端框架介绍
    使用 C# 捕获进程输出
    sonar扫描——方法重构分析
    消除代码中的坏味道,编写高质量代码
    TensorFlow之张量
  • 原文地址:https://www.cnblogs.com/CaptainLin/p/14205438.html
Copyright © 2011-2022 走看看