72 lines
2.6 KiB
Java
72 lines
2.6 KiB
Java
package com.xwolf.boot.aspect;
|
|
|
|
import com.xwolf.boot.annotation.AvoidRepeatableCommit;
|
|
import com.xwolf.boot.config.Constants;
|
|
import com.xwolf.boot.utils.IPUtil;
|
|
import com.xwolf.boot.utils.StringUtils;
|
|
import com.xwolf.boot.utils.UUIDUtil;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
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.core.annotation.Order;
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
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;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
/**
|
|
* 重复提交aop
|
|
* @author xwolf
|
|
* @version 1.0
|
|
* @since 1.8
|
|
*/
|
|
@Order
|
|
@Aspect
|
|
@Component
|
|
@Slf4j
|
|
public class AvoidRepeatableCommitAspect {
|
|
|
|
@Autowired
|
|
private RedisTemplate redisTemplate;
|
|
|
|
/**
|
|
* @param point
|
|
*/
|
|
@Around("@annotation(com.xwolf.boot.annotation.AvoidRepeatableCommit)")
|
|
public Object around(ProceedingJoinPoint point) throws Throwable {
|
|
|
|
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
|
|
String ip = IPUtil.getIP(request);
|
|
//获取注解
|
|
MethodSignature signature = (MethodSignature) point.getSignature();
|
|
Method method = signature.getMethod();
|
|
//目标类、方法
|
|
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);
|
|
log.info("ipKey={},hashCode={},key={}",ipKey,hashCode,key);
|
|
AvoidRepeatableCommit avoidRepeatableCommit = method.getAnnotation(AvoidRepeatableCommit.class);
|
|
long timeout = avoidRepeatableCommit.timeout();
|
|
if (timeout < 0){
|
|
timeout = Constants.AVOID_REPEATABLE_TIMEOUT;
|
|
}
|
|
String value = (String) redisTemplate.opsForValue().get(key);
|
|
if (StringUtils.isNotBlank(value)){
|
|
return "请勿重复提交";
|
|
}
|
|
redisTemplate.opsForValue().set(key, UUIDUtil.uuid(),timeout,TimeUnit.MILLISECONDS);
|
|
//执行方法
|
|
Object object = point.proceed();
|
|
return object;
|
|
}
|
|
|
|
} |