首先创建自定义标签
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 避免重复提交
*
* @author: lc
* @Date: 2018/11/16 0016 09:55
* @Description:
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AvoidRepeatableCommit {
/**
* 指定时间内不可重复提交,单位秒
*
* 使用 请求打@AvoidRepeatableCommit(timeout = 50) 时间默认可设置
* @return
*/
long timeout() default 10 ;
}
使用redis 来做表单防重复提交
/**
* 防重复提交aop
*
* @author: lc
* @Date: 2018/11/16 0018 10:36
* @Description:
*/
@Order(AopOrdered.DUPLICATE_FORMS_SUBMITTED)
@Aspect
@Component
@Slf4j
public class AvoidRepeatableCommitAspect {
@Autowired
private RedisUtil redisUtil;
/**
* @param point
*/
@Around("@annotation(com.lc.config.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();
//获取请求参数
Map query = request.getParameterMap();
//目标类、方法
String className = method.getDeclaringClass().getName();
String name = method.getName();
String ipKey = String.format("%s#%s#%s#%s", ip, className, name, query);
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) {
//默认30 秒
timeout = 30;
}
String value = redisUtil.get(key);
if (!StringUtils.isBlank(value)) {
//由于前段统一返回参数,故返回信息
return new ServerResponse.Builder()
.message("亲! 你点的太快了")
.code(ServerResponse.ERROR)
.build();
}
redisUtil.set(key, "-", timeout);
//执行方法*/
return point.proceed();
}
}
获取Ip工具类
public class IPUtil {
/**
* 获取IP地址
*
* @param request
* @return
*/
public static String getIP(HttpServletRequest request) {
String unknown = "unknown";
if (request == null) {
return unknown;
}
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
}