如何设计?

最初设计将生成验证码redis中存入 key 为手机号,value为验证码的键值对作为一个接口实现,但有问题是验证码不唯一,比如该手机号登录的验证码可以用于该手机号找回密码,这样肯定是不行的,后来尝试改用redis的hash结构,但需要前端配合传递 type 类型存入redis中,并且接口不能并发,最后采用生成不同类型验证码的多个接口实现,比如登录获取验证码为登录获取验证码接口,修改密码获取验证码为获取验证码接口,(采用 类型+手机号 的组合作为redis的key存入redis)

逻辑

接口一:生成验证码,存入redis,发送短信

接口二:前端输入的验证码和redis中的验证码是否匹配


生成6位验证码工具类

/*** 生成(6位)验证码工具类*/
public class VerifyCodeUtils {public static String createCode(){return String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999));}
}

发送短信工具类(购买阿里云)

需要获得短信签名,模板签名(或者appcode)

/***发送短信工具类*/
public class SmsUtils {/*** 仅仅完成将存入redis的验证码发送到目标手机上的短信功能* @param mob 手机号* @param code 后端生成的验证码*/public static void sendMsg(String mob,String code){String host = "https://miitangs09.market.alicloudapi.com";String path = "/v1/tools/sms/code/sender";String method = "POST";String appcode = "填入购买服务时的appcode";  //购买服务的appcode,在历史订单中查看Map<String, String> headers = new HashMap<String, String>();//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105headers.put("Authorization", "APPCODE " + appcode);//根据API的要求,定义相对应的Content-Typeheaders.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");//需要给X-Ca-Nonce的值生成随机字符串,每次请求不能相同headers.put("X-Ca-Nonce", UUID.randomUUID().toString());Map<String, String> querys = new HashMap<String, String>();Map<String, String> bodys = new HashMap<String, String>();bodys.put("filterVirtual", "false");bodys.put("phoneNumber", mob);bodys.put("reqNo", "miitangtest01");bodys.put("smsSignId", "0000");     //签名idbodys.put("smsTemplateNo", "0001"); //短信模板idbodys.put("verifyCode", code);        //验证码try {/*** 重要提示如下:* HttpUtils请从* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java* 下载** 相应的依赖请参照* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml*/HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);//获取response的bodySystem.out.println(EntityUtils.toString(response.getEntity()));} catch (Exception e) {e.printStackTrace();}}
}

手机验证码接口

    /*** 手机登录验证码接口** @param phone 手机号.*/@PublishMethodString LoginCode(String phone);

手机验证码接口实现

    /*** 手机登录获取验证码的实现* 返回值为 redis 中的key (相同用户 不同验证码接口对于的 key 是不同的)* @param phone 手机号.* @return*/@Overridepublic String LoginCode(String phone) {AssertUtils.ThrowArgOutRangeException(phone.length(),"手机号码的长度必须为11",11,11);String code = VerifyCodeUtils.createCode(); //后台生成6位验证码System.out.println("手机登录后台生成的验证码:"+code);String key = RedisSmsEnum.Login.getKey() + phone;  //拼接redis中唯一的keyredisTemplate.opsForValue().set(key,code, 300, TimeUnit.SECONDS); //生成验证码放入redis中,设置5分钟过期时间System.out.println("存入redis的验证码"+redisTemplate.opsForValue().get(key));SmsUtils.sendMsg(phone,code);        //发送(生成的验证码)到用户手机,暂时不开通,节约流量return key;}

登录使用验证码逻辑

    /*** 用户手机登录的实现  .** @param phone 手机号.* @param verifyCode 验证码.6c8512064f11420f83d6f7c3f10816ba*/@Overridepublic void loginBySms(String phone, String verifyCode) {AssertUtils.ThrowArgNullException("手机号不能为空",phone,true);AssertUtils.ThrowArgNullException("验证码不能为空",verifyCode,true);AssertUtils.ThrowArgOutRangeException(phone.length(),"手机号码的长度必须为11",11,11);AssertUtils.ThrowArgOutRangeException(verifyCode.length(),"验证码长度必须为6",6,6);String newPhone = RedisSmsEnum.Login.getKey() + phone;    //匹配唯一的redis中key(key为类型+电话号码的组合,保证key的唯一性)if (redisTemplate.opsForValue().get(newPhone) == null){throw new PsCoreRuntimeException("验证码过期");}if (!verifyCode.equals(redisTemplate.opsForValue().get(newPhone))){throw new PsCoreRuntimeException("验证码输入错误");}if (verifyCode.equals(redisTemplate.opsForValue().get(newPhone))){UserPOQueryPara para = new UserPOQueryPara();para.setParamByphone(phone);if (userPODao.queryList(para, 0, -1).size() == 0){throw new PsCoreRuntimeException("该用户不存在");}System.out.println("用户根据手机验证码登录成功");System.out.println("登录之后用户信息"+userPODao.queryList(para, 0, -1));redisTemplate.delete(newPhone);     //登录成功之后 删除验证码}}

【短信验证】手机登录短信验证相关推荐

  1. html 滑动拼图验证,vue登录滑动拼图验证

    vue登录滑动拼图验证 vue登录滑动拼图验证 一.安装插件: npm install --save vue-monoplasty-slide-verify 二.main.js引入: import S ...

  2. js验证银行卡号,并自动识别银行信息。js验证手机码。js验证数字

    1. 需求 工作要求,要对表单的一些内容进行校验,要求 验证是否输入的数字 验证手机号是否正确 验证银行卡号,并自动识别银行名称 2. 实现 2.1 验证数字 export function vali ...

  3. Android学习笔记:短信控制手机之“短信开启定位”

    2019独角兽企业重金招聘Python工程师标准>>> 首先,我必须说,我是菜鸟.接触Android不就久,在这里记下,第一想让自己有更加深刻的印象,第二也想和大家一起分享.如果出现 ...

  4. 把安卓手机当作短信猫的三款ANDROID应用

    把安卓手机当作短信猫,性能稳定,管理方便,最近研究了一下相关的ANDROID短信猫应用,推荐一下三款:虫虫云猫,SMSSync,中文版SMS Gateway,下面做分别做介绍. 1.虫虫云猫: 收到短 ...

  5. Flask项目实战——6—(前台用户模型、前台登录注册、图形验证码、手机短信验证码、添加表单验证短信验证码请求)

    1.前台用户模型 前台用户模型定义 创建前台模型文件 apps/front/models.py # -*- encoding: utf-8 -*- """ @File : ...

  6. 手机短信注册验证与登录功能

    文章目录 一.前言 二.准备工作 三.发布短信 1.基本测试发布 ①可-使用测试模板进行调试 ②测试结果 ③注意,可能会调试失败,是因为没有余额.进入首页点击头像>进入余额充值:一条大概4分钱 ...

  7. nodejs 实现手机注册短信发送验证(腾讯云)

    目录 前言 提前准备 nodejs使用 依赖包 代码 效果 尾言 前言 前段时间介绍了如何实现邮箱的验证,相比手机验证,更好一些,可以验证用户的手机号,防止别人恶意注册,本文介绍如何在nodejs实现 ...

  8. 短信验证php_php实现登录短信验证

    原标题:php实现登录短信验证 今天benny要跟大家说这个其实很简单,就是借用某一个平台的短信api接口实现短信验证,说简单呢,那是因为他的官网:http://www.ucpaas.com上有开发文 ...

  9. django-实现登录短信验证

    功能演示 核心任务 前端功能: 点击按钮Ajax调用发送验证码功能 输完验证码后Ajax调用验证功能 后端功能: 功能1:发送验证码功能 功能2:验证码检查 后台核心逻辑(不需要手写) 功能3:发短信 ...

最新文章

  1. 一种简易实现磁悬浮吊坠方案
  2. 在asp.net中解决cookies中文乱码问题
  3. ROS Indigo下安装测试Xtion Pro
  4. 10-03视图的优缺点及注意事项
  5. 给 C# 代码动态着色的 JavaScript 脚本
  6. 科普:TLS、SSL、HTTPS以及证书(转)
  7. 使用kaggle的notebook运行代码
  8. matlab 万年历,matlab时钟万年历 matlab时钟万年历(附word说明文档): 程序主要 联合开发网 - pudn.com...
  9. 虚拟机安装mysql_linux虚拟机中安装MySQL
  10. Excel VBA编程教程(基础一)
  11. 润乾报表开源 BI 组件学习
  12. fw325r虚拟服务器连接失败,fw325r重置后不能联网怎么办?
  13. 测试人员的职业规划 --整理标注
  14. 网易云解锁配置(windows)
  15. 运用类判断三角形的形状
  16. 在阿里云上设置CDN
  17. web自动化测试-第五讲: 三大切换
  18. 一年303个漏洞,Chrome被评为“最脆弱”浏览器,Opera 最安全!网友:Opera 还有人用?...
  19. matlab画多组数据折线图_使用Origin绘制不相关多组数据折线图的方法
  20. 关于透明桌面相框图片不能显示的问题

热门文章

  1. C4DtoA阿诺德渲染器安装包下载SolidAngle Arnold for Cinema4D R25 Mac安装教程
  2. android不同屏幕分辨率的适配
  3. 在正式使用计算机账务系统,计算机会计模板答案.doc
  4. 【Funpack】低功耗蓝牙 BLE 协议架构
  5. BIOS 和 EC的关系
  6. MT6757_MT6763芯片平台技术资料下载
  7. Ancient Cipher
  8. 第5章 运算符和表达式
  9. 坚鹏:中国工商银行从数字经济到银行场景化营销的公司业务转型
  10. Python 自动化教程(4) : 自动生成PPT文件 Part 2 (干货)