美文网首页
Spring Boot之请求重复提交解决(AOP)

Spring Boot之请求重复提交解决(AOP)

作者: yellow_han | 来源:发表于2019-06-01 15:29 被阅读0次

1、问题描述

  • 用户点击过快导致前端发起多次请求。
  • 恶意刷接口。
  • 前端未知情况导致请求提交多次。
  • 等等
以上情况都有可能导致出现异常数据

2、示例

NoRepeatSubmit.java
package com.hsshy.beam.common.annotion;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.PARAMETER, ElementType.METHOD}) // 作用到方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时有效
public @interface NoRepeatSubmit {

}
NoRepeatSubmitAspect.java
package com.hsshy.beam.seckill.aspectj;
import com.hsshy.beam.common.utils.R;
import com.hsshy.beam.common.utils.RedisUtil;
import com.hsshy.beam.common.utils.ToolUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Scope
@Aspect
@Order(1)
public class NoRepeatSubmitAspect {

    @Autowired
    private RedisUtil redisUtil;

    //Service层切点     用于记录错误日志
    @Pointcut("@annotation(com.hsshy.beam.common.annotion.NoRepeatSubmit)")
    public void lockAspect() {
        
    }
    
    @Around("lockAspect()")
    public  Object around(ProceedingJoinPoint joinPoint) {
        Object obj = null;
        String key1 = joinPoint.getArgs()[0].toString();
        String key2 = joinPoint.getArgs()[1].toString();
        if(ToolUtil.isNotEmpty(redisUtil.get("repeat_"+key1+":"+key2))){
            System.out.println("重复订单:"+key2);
            return R.fail("订单重复提交");
        }
        else {
            redisUtil.set("repeat_"+key1+":"+key2,"1",2L);
            try {
                    obj = joinPoint.proceed();
            } catch (Throwable e) {
                e.printStackTrace();
                throw new RuntimeException();
            } finally{

            }
            return obj;
        }

    }
}

3、源码地址:https://gitee.com/hsshy/beam-example

相关文章

网友评论

      本文标题:Spring Boot之请求重复提交解决(AOP)

      本文链接:https://www.haomeiwen.com/subject/auhatctx.html