用户根据短信验证码注册
用户注册
需求分析
注册账号,用手机号注册,填写后发送短信验证码,填写短信验证码正确方可注册成功。
实现思路
(1)发送短信验证码逻辑:用户服务将要发送的短信验证码发送给rabbitmq和redis ,
短信服务将消息从rabbitmq中取出并调用阿里云通信发送短信。阿里云通信整合了三大
运营商的短信网关,最终把验证码发送到用户的手机上。rabbitmq采用直接模式,用户
服务为消息生产者,短信服务为消息消费者。
(2)注册逻辑:注册时从redis中提取短信验证码与用户填写的验证码进行比对,如果一
致则可以注册,否则拦截请求。
后端代码
发送短信验证码到MQ
实现思路: 在用户服务编写API ,生成手机验证码,存入Redis并发送到RabbitMQ
1.添加配置文件applicationContext-rabbitmq-producer.xml
<beans …/>
<!‐‐连接工厂‐‐>
<rabbit:connection‐factory id=“connectionFactory” host=“127.0.0.1” port=“5672” username=“guest” password=“guest” />
<rabbit:admin connection‐factory=“connectionFactory”></rabbit:admin>
<!‐‐创建队列‐‐>
<rabbit:queue name=“queue.sms” />
<rabbit:template id=“rabbitTemplate” connection‐factory=“connectionFactory” />
2.在UserService中新增方法定义
/**
- 发送短信验证码
- @param mobile
*/
public void sendSms(String phone);
3.UserServiceImpl方法实现
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private RabbitTemplate rabbitTemplate;
/**
- 发送短信验证码
- @param phone
*/
public void sendSms(String phone){
//1.得到六位短信验证码
int max=999999;
int min=100000;
Random random = new Random();
int code = random.nextInt(max);
if(code<min){
code=code+min;
}
System.out.println(“短信验证码:”+code);
//2.保存到redis里
redisTemplate.boundValueOps(“code_”+phone).set(code+"");
redisTemplate.boundValueOps(“code_”+phone).expire(5,TimeUnit.MINUTES);//5分钟失效
//3.发送给RabbitMQ
Map<String,String> map=new HashMap();
map.put(“phone”, phone);
map.put(“code”, code+"");
//因为不能发送Map形式的数据,需要转为字符串
rabbitTemplate.convertAndSend("",“queue.sms”,JSON.toJSONString(map)); //直接模式,使用默认的交换器 RouteKey就是队列的名称
}
4.新增UserController
@RestController
@RequestMapping("/user")
public class UserController {
@Reference
private UserService userService;
/**
- 发送短信验证码
- @param phone
*/
@GetMapping(value="/sendSms")
public Result sendSms(String phone){
userService.sendSms(phone);
return new Result();
}
}
短信服务接收消息
短信发送是由单独的短信服务提供的功能,所有的短信都是先发送到消息队列,短信服务从消息队列中提取手机号和验证码,调用短信发送接口进行发送短信。
添加监听实现类SmsMessageConsumer
public class SmsMessageConsumer implements MessageListener {
public void onMessage(Message message) {
String jsonString = new String(message.getBody());
Map<String,String> map = JSON.parseObject(jsonString, Map.class);
String phone = map.get(“phone”);
String code=map.get(“code”);
System.out.println(“手机号:”+phone+“验证码:”+code);
}
}
添加配置文件applicationContext-rabbitmq-consumer.xml
<!‐‐连接工厂‐‐>
<rabbit:connection‐factory id=“connectionFactory” host=“127.0.0.1”
port=“5672” username=“guest” password=“guest” />
<!‐‐创建队列‐‐>
<rabbit:queue name=“queue.sms” />
<!‐‐消费者监听类‐‐>
<!‐‐设置监听容器‐‐>
<rabbit:listener‐container connection‐factory=“connectionFactory” >
<rabbit:listener queue‐names=“queue.sms” ref=“messageConsumer”/>
</rabbit:listener‐container>
用户注册 (用户收到验证码后,输入验证码点击注册)
(1)UserService增加方法定义
/**
- 增加
- @param user
- @param smsCode
*/
public void add(User user,String smsCode); //参数为用户信息和短信验证码
(2)UserServiceImpl实现方法
/**
- 增加
- @param user
- @param smsCode
*/
public void add(User user,String smsCode) {
//比较短信验证码
//从Redis中获取系统短信验证码(系统生成的)
String sysCode= (String) redisTemplate.boundValueOps(“code_”+user.getPhone()).get();
if(sysCode==null){
throw new RuntimeException(“验证码未发送或已过期”);
}
if(!smsCode.equals(sysCode)){
throw new RuntimeException(“验证码不正确”);
}
if(user.getUsername()==null){
user.setUsername(user.getPhone());
}
User searchUser=new User();
searchUser.setUsername(user.getUsername());
//应该可以直接根据手机号去搜索数据库中的手机号字段看是否存在该手机号,因为用户可能会在系统中修改用户名,根据用户名去判断就没意义了,除非设置用户名不能修改
if(userMapper.selectCount(searchUser)>0) { //查询是否存在相同记录 selectCount是根据条件查询满足条件的记录数
throw new RuntimeException(“该手机号已注册”);
}
user.setCreated(new Date());
user.setUpdated(new Date());
user.setPoints(0);//积分初始值为0
user.setStatus(“1”);//状态1
user.setIsEmailCheck(“0”);//邮箱认证,还未认证
user.setIsMobileCheck(“1”);//手机认证,已认证
userMapper.insert(user); //将用户信息存入数据库
}
(3)UserController增加方法
@PostMapping("/save")
public Result save(@RequestBody User user , String smsCode ){
//密码加密
BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
String newpassword = encoder.encode(user.getPassword());
user.setPassword(newpassword);
userService.add(user,smsCode);
return new Result();
}
用户根据短信验证码注册相关推荐
- 使用阿里云短信验证码API发送短信验证码(配置,获取短信验证码,注册,登录,密码重置)
获取阿里云短信验证码需要的配置信息. 如果是新用户,可以免费领取3个月,老用户的话就只能购买了,但是也不贵. 申请短信签名 申请短信模板 编写发送短信验证码的工具类 代码中我已经进行了详细的注释,也写 ...
- 手机短信验证码注册-短信平台验证码开发6
经过前面的基础准备工作后, 就可以正式进入开发的阶段了, 我们的短信接口开发, 主要以实现手机短信验证码功能案例, 进行演示, 因为这个功能在实际项目中用得最多. 这一节课程, 我们先把手机短信验证码 ...
- Jmeter-函数助手-随机函数的使用(模拟1000+个手机用户获取短信验证码)
如何模拟1000个手机用户登录? 现在很多APP或者网站都需要使用手机号进行登录,那么使用手机号进行登录时,必然就需要"手机号+短信验证码"才可登录成功. 在实际测试过程中,测试人 ...
- php 短信验证登录,短信验证码注册登录的实现,php接入的3种方法(附示例)
上周,有朋友需要帮忙做一个关于手机短信验证码注册登录的功能,之前没有做过,于是我查查资料,汇总出PHP接入短信验证码的3种方法,现在和大家分享: 1.cURL $curl = curl_init(); ...
- ThinkPHP5 实现短信验证码注册功能
在现在这个短信通知泛滥的年代,短信验证码成了不可或缺,与此同时,短信验证码的平台也是各种各样.这样一来,平台好坏就无从区分.这里推荐用云之讯的吧,速度还不错,延迟没有,还送10块钱(100多条吧,测试 ...
- 用户登录短信验证码的实现
目前比较流行的登录方式就是短信验证码登录,但是这种方式是需要借助第三方短信提供商(即为付费的官方接口),其实现流程如下: 具体实现如下 : //使用前需要先下载包 let md5 = require( ...
- C# - RestSharp实现短信验证码注册登录完整示例
这次给大家介绍C# - RestSharp实现短信验证功能的方法,由于,短信验证码是现在不可或缺的一种身份验证方式,所以,就来看看通过C#通过RestSharp的方式实现验证功能,下面就以云市场服务商 ...
- 14、阿里云短信Demo演示、Http的Get请求和Post请求演示、httpClient工具类演示、发送短信模块搭建、搭建用户中心模块、完成user注册基本功能、验证码存入redis、短信验证码注册
阿里云短信Demo演示 一.前端部分 无前端. 二.后端部分 1.创建发送短信测试模块SmsSendDemo,不用使用骨架. 2.在pom文件中引入依赖坐标 <dependency>< ...
- 阿里云短信验证码注册及使用
注册 阿里云网址https://www.aliyun.com/product/sms 创建用户获取AccessKey和ACCESS_KEY_SECRET 在头像下点击AccessKey管理,进入后会有 ...
- 向用户发送短信验证码
public static string SendMessage(string phonenum, string code) { String encode = ...
最新文章
- VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)
- Java中的锁原理、锁优化、CAS、AQS详解
- 句法分析应用领域及意义
- php值比较大小,PHP_PHP浮点比较大小的方法,本文实例讲述了PHP浮点比较大 - phpStudy...
- mysql删除所有存储过程_mysql 删除所有存储过程
- 编写一个头像裁剪组件(一)
- java求解给定一整数和指定指数求解计算结果
- Web前端开发视频教程
- ue修改倚天服务器时间,正途私服UE修改一些配置脚本
- 人脸识别应用在美国受禁,因噎废食还是以人为本?
- 全微分推导: 全微分感性理解: 全微分几何意义举例: 偏导与全微分的意义 通过物理性质理解。偏导与全微分的意义
- 运筹学4个人完成三项工作_【用人话讲运筹学】十一、指派问题
- 【学习笔记】算法101--数学(二)2.3篇
- 算法刷题路线总结与相关资料分享
- 用python把学习通导出成绩,未完善
- 小程序源码:后台版本趣味测试微信小程序源码下载支持自定义问题等等
- 颈椎间盘突出的治疗方法
- PooledDataSource forcefully closed/removed all connections的解决
- 伺服速度控制模式接线图_伺服参数设置很重要(位置控制模式、速度控制模式、力矩控制)...
- VIN码含义及其算法