web 防重复提交实现

通过注解方式,在aop中判断是否重复提交。
整个流程如下。


image.png

注解

/**
 * @author river
 * @date 2019/5/27 11:38
 **/
@Retention(RUNTIME)
@Target(ElementType.METHOD)
public @interface NoRepeatSubmit {
}

AOP 内处理业务

/**
 * @author river
 * @date 2019/5/27 11:40
 **/
@Aspect
@Component
@Slf4j
public class NoRepeatSubmitAop {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public static final String NO_REPEAT_COMMIT = "NO_REPEAT_COMMIT:";

    @Around("@annotation(noRepeatSubmit)")
    public Object arround(ProceedingJoinPoint pjp, NoRepeatSubmit noRepeatSubmit) throws Throwable {
        ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        String sessionId = RequestContextHolder.getRequestAttributes().getSessionId();
        HttpServletRequest request = attributes.getRequest();

        String key = NO_REPEAT_COMMIT + sessionId + "-" + request.getServletPath();
        // 如果缓存中有这个url视为重复提交
        if (opsForValue.get(key) == null) {
            Object o = pjp.proceed();
            opsForValue.set(key, "no repeat commit", 2, TimeUnit.SECONDS);
            return o;
        }

        log.debug("key = {} 重复提交", key);
       // 抛出异常 - 给前端
        throw new Exception("重复提交");
    }
}

这样如果是2秒内 同一个 url 的请求,就会被拦截(抛出异常)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对于java中的思考的方向,1必须要看前端的页面,对于前端的页面基本的逻辑,如果能理解最好,不理解也要知道几点。 ...
    神尤鲁道夫阅读 842评论 0 0
  • 1.JVM 堆内存和非堆内存 堆和非堆内存按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据...
    yanzhu728阅读 945评论 0 0
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 987评论 0 0
  • IOC和DI是什么? Spring IOC 的理解,其初始化过程? BeanFactory 和 FactoryBe...
    justlpf阅读 3,505评论 1 21
  • 凡事顺其自然, 凡事不可强求。 人生是一次单边行程, 很多东西都是唯一的, 错过了就不可能再遇到。 世界变化如此的...
    曼萝白薇阅读 226评论 2 4