[JAVA] java实现发送验证码登录

3583 3
123456789qwe 2022-11-13 17:32:59 | 显示全部楼层 |阅读模式

准备工作


    去腾讯,阿里等等云服务平台注册账号,开启短信服务。使用对应的API进行发送。
    这里使用阿里的。
使用
    短信发送
           /**
         * 发送短信
         * @param signName 签名
         * @param templateCode 模板
         * @param phoneNumbers 手机号
         * @param param 参数
         */
        public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
                DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
                IAcsClient client = new DefaultAcsClient(profile);

                SendSmsRequest request = new SendSmsRequest();
                request.setSysRegionId("cn-hangzhou");
                request.setPhoneNumbers(phoneNumbers);
                request.setSignName(signName);
                request.setTemplateCode(templateCode);
                request.setTemplateParam("{\"code\":\""+param+"\"}");
                try {
                        SendSmsResponse response = client.getAcsResponse(request);
                        System.out.println("短信发送成功");
                }catch (ClientException e) {
                        e.printStackTrace();
                }
        }
      验证码随机生成
         /**
     * 随机生成验证码
     * @param length 长度为4位或者6位
     * @return
     */
    public static Integer generateValidateCode(int length){
        Integer code =null;
        if(length == 4){
            code = new Random().nextInt(9999);//生成随机数,最大为9999
            if(code < 1000){
                code = code + 1000;//保证随机数为4位数字
            }
        }else if(length == 6){
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if(code < 100000){
                code = code + 100000;//保证随机数为6位数字
            }
        }else{
            throw new RuntimeException("只能生成4位或6位数字验证码");
        }
        return code;
    }

    /**
     * 随机生成指定长度字符串验证码
     * @param length 长度
     * @return
     */
    public static String generateValidateCode4String(int length){
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
执行流程
1.前端输入手机号点击发送验证码,前端先判断手机号格式是否正确,正确发送手机号到后端
2.后端判断手机号是否正确,正确则继续
3.后端生成随机数验证码,保存到缓存中(如redis等等)需要存两份,第一份5分钟判断验证码过期时间,第二份1分钟判断验证码发送时间,防止用户频繁发送验证码导致短信服务欠费
4.后端通过对应短信API发送短信到用户手机号,用户前端输入验证码之后,点击发送,传递到后端
5.后端对验证码进行判断处理,正确则登录成功,不正确则登录失败
6.登录成功判断是否存在该用户,不存在则实现注册流程,存在则登录
123456789qwe 2022-11-13 23:06:25 | 显示全部楼层
    //后端发送前台验证码
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session){
        //获取手机号
        String phone=user.getPhone();
        //判断手机号正确性
        if (phone.matches("/^(??:\+|00)86)?1(??:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/")) {
                return R.error("手机号错误,请重新输入");
        }
        //验证码在1分钟之内发送过返回
        if (redisTemplate.hasKey(phone+"cf")) {
            return R.error("验证码已发送!请等待"+redisTemplate.getExpire(phone+"cf")+"秒");
        }
        //判断是否输入手机号
        if (StringUtils.isNotEmpty(phone)){
            String code="123456";
            //通过工具类生成4位验证码
//            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            //打印验证码日志
//            log.info("code={}",code);
            //调用阿里云提供的短信服务API完成发送短信
            //SMSUtils.sendMessage("短信名称"",phone,code);
            redisTemplate.opsForValue().set(phone+"cf", code, Duration.ofMinutes(1));
            //需要将生成的验证码保存到Session
            redisTemplate.opsForValue().set(phone, code, Duration.ofMinutes(5));

            //返回验证码成功
            return R.success("手机验证码短信发送成功");
        }
        //返回验证码失败
        return R.error("短信发送失败");
    }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

123456789qwe

初入联盟

关注
  • 5
    主题
  • 0
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行