Commit 0084e760 authored by 杨锐's avatar 杨锐

add annotation AccessLimit。

parent 4bb5e3a1
package cn.quantgroup.xyqb.aspect.limit;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 禁止接口频繁访问
* <p>
* 使用该组件,方法入参,首参数应为userId
* </p>
* Date: 2019/11/6
* Time: 下午5:07
*
* @author: yangrui
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {
String redisKey();
}
package cn.quantgroup.xyqb.aspect.limit;
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.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Aspect
@Component
public class AccessLimitAspect {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* 要求不高时 可使用。
* setnx + expire 问题,lua解决。
* expire问题,严谨可使用Redission。
*
* @param pjp
* @throws Throwable
*/
@Around("@annotation(cn.quantgroup.xyqb.aspect.limit.AccessLimit)")
public void accessLimit(ProceedingJoinPoint pjp) throws Throwable {
AccessLimit accessLimit = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(AccessLimit.class);
String redisKey = accessLimit.redisKey() + "_" + pjp.getArgs()[0];
boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(redisKey, "");
if (lock) {
stringRedisTemplate.expire(redisKey, 1, TimeUnit.MINUTES);
try {
pjp.proceed();
} finally {
stringRedisTemplate.delete(redisKey);
}
}
}
}
...@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.service.user.impl; ...@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.service.user.impl;
import cn.quantgroup.user.enums.ModifyPhoneNoApplyStatusEnum; import cn.quantgroup.user.enums.ModifyPhoneNoApplyStatusEnum;
import cn.quantgroup.user.enums.ModifyPhoneNoProcessingStatusEnum; import cn.quantgroup.user.enums.ModifyPhoneNoProcessingStatusEnum;
import cn.quantgroup.xyqb.aspect.limit.AccessLimit;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.AuditReq; import cn.quantgroup.xyqb.controller.modifyphoneno.req.AuditReq;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.ModifyPhoneNoQueryReq; import cn.quantgroup.xyqb.controller.modifyphoneno.req.ModifyPhoneNoQueryReq;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step1Req; import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step1Req;
...@@ -72,9 +73,9 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService { ...@@ -72,9 +73,9 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
* @return * @return
*/ */
@Override @Override
@AccessLimit(redisKey = "saveStep1")
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long saveStep1(Long userId, Step1Req step1Req) { public Long saveStep1(Long userId, Step1Req step1Req) {
// TODO: 2019/11/4 并发访问
allowModify(userId, step1Req.getName(), step1Req.getIdCard(), step1Req.getPrevPhoneNo(), step1Req.getCurPhoneNo(), allowModify(userId, step1Req.getName(), step1Req.getIdCard(), step1Req.getPrevPhoneNo(), step1Req.getCurPhoneNo(),
step1Req.getSmsCode()); step1Req.getSmsCode());
ModifyPhoneNo modifyPhoneNo = Step1Req.adapt(step1Req); ModifyPhoneNo modifyPhoneNo = Step1Req.adapt(step1Req);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment