商管系统利用Springboot-AOP手机短信验证码发送

首页 » 技术栈 » 商管系统利用Springboot-AOP手机短信验证码发送

【需求介绍】

正在开发的商管系统,新开发手机号注册账户功能,需要控制手机发送验证码次数,系统采用的微服务架构,这里只用关心用户中心模块发送短信接口功能,至于消息模块不在此讨论。

需求:要求手机号发送短信后,此手机号锁定60秒,短信验证码生效时间为15分钟。

【实现思路】

采用redis做缓存,

AOP切面,注解方式实现处理

【代码示例】

(1)首先编写一个注解类,用来定义手机号

验证码限制注解类

/**
 * 验证码限制注解
 * @author Qiyunhao
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface VerifyCodeLimit {

    /**
     * 手机号码
     * @return
     */
    String argMobile() default "";
}

(2)定义一个验证码限制切面类

验证码限制切面类

/**
 * 验证码限制切面
 */
@Aspect
@Component
public class VerifyCodeLimitAspect {

    private static final Logger logger = LoggerFactory.getLogger(VerifyCodeLimitAspect.class);

    private static final String AEGEAN_MOBILE_LOCK_PREFIX = "mobile_lock:";
    private static final String AEGEAN_VERIFY_CODE_PREFIX = "mobile_verify_code:";

    @Autowired
    private RedisTemplate redisTemplate;

    @Pointcut("@annotation(com.mklinfo.user.service.annotation.VerifyCodeLimit)")
    public void verifyCodeLimit() {
    }

    /**
     * 定义环绕增强-手机发送验证码限制
     */
    @Around(value = "verifyCodeLimit()")
    public Object verifyCodeLimit(ProceedingJoinPoint joinPoint) throws Throwable {

        logger.info("operateCache around start ...");
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();

        //1.获取注解
        VerifyCodeLimit verifyCodeLimit = method.getAnnotation(VerifyCodeLimit.class);

        //2.获取注解参数
        String argMobile = verifyCodeLimit.argMobile();

        //3.解析spel表达式key
        String mobile = SpelParseUtil.parseSpel(argMobile, method, joinPoint.getArgs());
        logger.info("cache key is " + mobile);

        //4.缓存数据获取
        if (redisTemplate.hasKey(AEGEAN_MOBILE_LOCK_PREFIX + mobile)) {
            logger.info("CacheAsidePattern data from cache ...");
            //存在
            redisTemplate.expire(AEGEAN_MOBILE_LOCK_PREFIX + mobile, 60, TimeUnit.SECONDS);
            throw new ServiceException(ResultCode.C403.getCode(), "当前手机号锁定中,请等待60秒后再试,手机号:" + mobile);
        } else {
            logger.info("CacheAsidePattern data from db ...");
            //设置手机锁
            redisTemplate.opsForValue().set(AEGEAN_MOBILE_LOCK_PREFIX + mobile, "lock", 60, TimeUnit.SECONDS);
            //不存在,执行方法体  返回验证码
            Object obj = joinPoint.proceed();
            //放入缓存
            redisTemplate.opsForValue().set(AEGEAN_VERIFY_CODE_PREFIX + mobile, obj, 15, TimeUnit.MINUTES);
            logger.info("VerifyCodeCache is,{}",AEGEAN_VERIFY_CODE_PREFIX + mobile + "_" + obj );
            logger.info("operateCache around end ...");

            //返回
            return obj;
        }
    }
}

短信发送业务逻辑

/**
     * 发送验证码
     * @param phoneNumber
     * @return
     */
    public ResultResponse<String> sendVerifyCode(String phoneNumber) {
        //发送手机验证码校验
        String result = ((TenantRegisterService) AopContext.currentProxy()).sendMobileVerifyCode(phoneNumber);
        return ResultResponse.success(result);
    }
/**
     * 发送短信
     * @param phoneNumber
     * @return
     */
    @VerifyCodeLimit(argMobile = "#phoneNumber")
    public String sendMobileVerifyCode(String phoneNumber) {
        //1.生成6位随机验证码
        String randomCode = RandomStringUtils.randomNumeric(6);
        //2.执行短信的发送 编辑短信内容
        StringBuilder msg = new StringBuilder(50);
        msg.append("感谢注册,这是您的手机验证码:").append(randomCode).append(",有效期为:").append("15").append("分钟,请尽快适用");
        //模拟发送
        System.out.println(msg.toString());
        //sendRealSms(phoneNumber,msg.toString());
        return randomCode;
    }

注册时候从缓存拿验证码进行对比

//验证码校验
String verifyCode = tenantInfoVo.getVerifyCode();
//从缓存中获取验证码
String cacheVerifyCode = (String) redisTemplate.opsForValue().get(AEGEAN_VERIFY_CODE_PREFIX + tenantInfoVo.getMobile());
if (!verifyCode.equals(cacheVerifyCode)) {
    logger.error("{},租户注册 -- 无效的验证码:{} vs. {}", MODULE, verifyCode, cacheVerifyCode);
    throw new ServiceException("验证码错误,请重新输入");
}
打赏 赞(16)
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏

大家好!欢迎光临我的博客,在下就是闭月羞花沉鱼落雁才高八斗貌似天仙玉树凌风赛潘安一枝梨花压海棠人送外号上天下地无所不能美貌与智慧并存、古典与活泼的化身~~
觅·You小栈» 商管系统利用Springboot-AOP手机短信验证码发送

版权声明: 本站原创文章,于2019年02月20日由觅·You发布,转载请注明出处

亭边总有花影,与我消遣一段旖旎的小时光

立即查看 联系作者
正在获取,请稍候...
00:00/00:00