栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

生成验证码同时避免频繁操作

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

生成验证码同时避免频繁操作

String generateCode(String key) {
        String code;
        Long nowTime = System.currentTimeMillis();
        List list = redisTemplate.boundHashOps(key).multiGet(Arrays.asList(CODE, "lastSendTime"));
        if (Objects.isNull(list.get(0)) || Objects.isNull(list.get(1))) {
            code = getSixRandom();
            Map map = ImmutableMap.of(CODE, code, "lastSendTime", String.valueOf(nowTime));
            redisTemplate.opsForHash().putAll(key, map);
        } else {
            Long lastSendTime = Long.valueOf((String) list.get(1));
            // 发送频率检查
            if (nowTime - lastSendTime < SENDING_FREQUENCY) {
                throw new BusinessException(ApiResult.SEND_SMS_FREQUENTLY);
            }
            redisTemplate.opsForHash().put(key, "lastSendTime", String.valueOf(nowTime));
            code = (String) redisTemplate.opsForHash().get(key, CODE);
        }
        return code;
    } 
@Override
    public ApiResult sendEmailCode(Integer type, String email, Map templateParam) {
        String sendCodePrefix;
        Example example =Example.builder(User.class).andWhere(Sqls.custom().andEqualTo("username",email).andEqualTo("deleted",false)).build();
        User user = userMapper.selectoneByExample(example);
        if(Objects.nonNull(user)){
            //发送短信的类型:目的是为了注册 那用户为空则已经注册
            if (type.equals(SendCodeType.REGISTER.ordinal())) {
                throw new BusinessException(ApiResult.USERNAME_IS_REGISTERED);
            }
            //用户注册过 但是被锁定
            if (user.getStatus().equals(UserStatus.LOCKED.ordinal())) {
                throw new BusinessException(ApiResult.BE_LOCKED);
            }

            if (type.equals(SendCodeType.FORGET_PWD.ordinal())) {
                sendCodePrefix = RedisKeyPrefix.USER_FORGET_PWD_PREFIX + email;
            } else if (type.equals(SendCodeType.BIND.ordinal())) {
                // 手机号被绑定,无法发送
                Example userAuthExample = Example.builder(UserAuth.class).where(Sqls.custom().andEqualTo("userId", user.getId())).build();
                if (userAuthMapper.selectCountByExample(userAuthExample) > 0) {
                    throw new BusinessException(ApiResult.USER_AUTH_BIND);
                }

                sendCodePrefix = RedisKeyPrefix.USER_BIND_PHONE_PREFIX + email;
            } else {
                sendCodePrefix = RedisKeyPrefix.USER_UPDATE_PREFIX + email;
            }
        }else {
            //用户为空
            if (type.equals(SendCodeType.FORGET_PWD.ordinal())) {
                throw new BusinessException(ApiResult.USERNAME_IS_NOT_EXIST);
            } else if (type.equals(SendCodeType.BIND.ordinal())) {
                sendCodePrefix = RedisKeyPrefix.USER_BIND_PHONE_PREFIX + email;
            } else {
                sendCodePrefix = RedisKeyPrefix.USER_REGISTER_PREFIX + email;
            }
        }
        if (templateParam == null) {
            //设置初始容量
            templateParam = new HashMap<>(2);
        }

        String code = generateCode(sendCodePrefix);

        redisTemplate.expireAt(sendCodePrefix, DateUtils.addMinutes(new Date(), 5));
        templateParam.put(CODE, code);
        //调用发送邮件接口
        String result = emailService.sendCodeMail(email, code, "5", type, "zh");
        if(result!=null){
            return ApiResult.SUCCESS;
        }
        return ApiResult.BUSINESS_FAIL;
    }

生成验证码的方法很有意思 避免频繁操作 

这种redis操作hash的思想很有意思

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号