springboot项目后台通过注解的形式,防止指定接口重复提交
代码如下:
package org.common.aspect;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.common.api.vo.Result;
import org.common.aspect.annotation.LockMethod;
import org.common.constant.CommonConstant;
import org.common.util.RedisUtil;
import org.common.util.SpringContextUtils;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
/**
* 防止表单重复提交
*/
@Aspect
@Component
@Slf4j
public class LockMethodAspect {
@Autowired
private RedisUtil redisUtil;
@Pointcut("@annotation(org.common.aspect.annotation.LockMethod)")
public void pointCut() {
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable{
HttpServletRequest request = SpringContextUtils.getHttpServletRequest();
String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);
if (StringUtils.isEmpty(token)){
return Result.error("token不存在!");
}
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
LockMethod annotation = method.getAnnotation(LockMethod.class);
int waitTime = annotation.waitTime();
String prefix = token + "-" + request.getRequestURI();
if (redisUtil.hasKey(prefix)){
return Result.error("请勿重复操作!");
}
redisUtil.set(prefix,prefix,waitTime);
return point.proceed();
}
}
注解:
package org.common.aspect.annotation;
import java.lang.annotation.*;
/**
* 防止表单重复提交
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LockMethod {
//默认一秒只能提交一次
int waitTime() default 1;
}
使用方法:在指定接口上使用注解@LockMethod