基于AOP+Redis实现表单防重复提交以及接口数据锁

  • Post author:
  • Post category:其他


  1. 创建AOP接口相关


@Target(ElementType.

METHOD

)


@Retention(RetentionPolicy.

RUNTIME

)


public @interface RedisLock {


//redis锁的key


public String key();


//过期时间


public long timeOut();


//和key一起组成的key名称。例如 key_abc


public String keyFieldName();


//从请求端获取的数据字段


public String valueFieldName();


//1:防重复提交。2:锁定数据:锁定数据以 valueFieldName 字段的数据为判断是不是同一个人的请求


public String lockType();


//返回的msg信息


public String returnMsg();


}

2、


@Aspect


@Component


public class RedisLockAspect {


@Autowired


private RedisUtils redisUtils;


@Pointcut(“@annotation(com.robotime.common.annotation.RedisLock)”)


public void pointCut() {


}


@Before(“pointCut()”)


public void before(JoinPoint point) {


RedisLock redisLock = getAnnotationLog(point);


if (redisLock == null) {


return;


}


Object[] args = point.getArgs();


Map<String, Object> map = JSONObject.

parseObject

(JSON.

toJSONString

(args[0]));


String key = map.get(redisLock.keyFieldName()).toString();


String value = map.get(redisLock.valueFieldName()).toString();


Boolean lock = redisUtils.setIfAbsent(redisLock.key() + key, value, redisLock.timeOut());


if (!lock) {


if(“1”.equals(redisLock.lockType())){


System.

out

.println(“—————————-锁—————————–“);


System.

out

.println(“频繁操作提交”);


throw new RedisLockRuntimeException(110,redisLock.returnMsg());


}else if(“2”.equals(redisLock.lockType())){


Object redisValue = redisUtils.get(“redis_lock_” + redisLock.key() + key);


String lockValue = redisValue != null ? redisValue.toString() : null;


if (lockValue != null && !lockValue.equals(value)) {


System.

out

.println(“—————————-锁—————————–“);


throw new RedisLockRuntimeException(110,redisLock.returnMsg());


}


}


}


}



/**



* 是否存在注解,如果存在就获取



*/




private RedisLock getAnnotationLog(JoinPoint joinPoint) {


Signature signature = joinPoint.getSignature();


MethodSignature methodSignature = (MethodSignature) signature;


Method method = methodSignature.getMethod();


if (method != null) {


return method.getAnnotation(RedisLock.class);


}


return null;


}


}

使用方法一:表单防重复提交

其中。

keyFieldName = “userId”。valueFieldName = “userId”。中的userId,为 Pintu 实体类中的字段。

使用方法二:数据锁。

注意:使用这种方式。接口接收参数的方式必须为

@RequestBody 实体类。否在在aop中


Map<String, Object> map = JSONObject.

parseObject

(JSON.

toJSONString

(args[0]));


方法获取不到参数。


请作者喝咖啡



版权声明:本文为qq_32649431原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。