1. 程式人生 > 其它 >防重複提交

防重複提交

註解類:

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

/**
* @Description:
* @Auther: CW
* @Date: 2021/8/25 10:24
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AvoidRepeatableCommit {
/**
* 指定時間內不可重複提交,單位毫秒
* @return
*/
long timeout() default 2 ;
}

邏輯類:

import com.cw.common.annotation.AvoidRepeatableCommit;
import com.cw.common.util.IPUtil;
import com.cw.common.util.JsonUtil;
import com.cw.common.util.RedisUtil;
import com.cw.common.util.ResultData;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

/**
* @Description:
* @Auther: CW
* @Date: 2021/8/25 10:24
*/
@Aspect
@Component
public class AvoidRepeatableCommitAspect {
@Autowired
private RedisUtil redisUtil;

@Around("@annotation(com.cw.common.annotation.AvoidRepeatableCommit)")
public ResultData around(ProceedingJoinPoint point) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String ip = IPUtil.getIPAddress(request);
//獲取註解
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();

//2.最關鍵的一步:通過這獲取到方法的所有引數名稱的字串陣列
Object[] args = point.getArgs();
Object o = JsonUtil.objectToJson(args[0]);
// int i = o.toString().hashCode();

//目標類、方法
String className = method.getDeclaringClass().getName();
String name = method.getName();
String ipKey = String.format("%s#%s",className,name);
int hashCode = Math.abs(ipKey.hashCode());
String key = String.format("%s_%d",ip,hashCode);
AvoidRepeatableCommit avoidRepeatableCommit = method.getAnnotation(AvoidRepeatableCommit.class);
long timeout = avoidRepeatableCommit.timeout();
if (timeout < 0){
//過期時間2s
timeout = 2;
}
Integer value = (Integer) redisUtil.get(key);
if (value!=null && o.toString().hashCode()==value){
return ResultData.returnData(3,"請勿重複提交",null);
}
redisUtil.set(key, o.toString().hashCode(),timeout);

//執行方法
Object object = point.proceed();
if (object instanceof ResultData){
return (ResultData) object;
}
return ResultData.returnData(1,"ok",object);
}

}

呼叫:

@AvoidRepeatableCommit