有关阿里云通信短信服务验证码的发送,请参考我的另一篇文章 Springboot实现阿里云通信短信服务有关短信验证码的发送功能

思路
用户输入手机号后,点击按钮获取验证码。并设置冷却时间,防止用户频繁点击。
后台生成验证码并发送到用户手机上,根据验证码、时间及一串自定义秘钥生成MD5值,并将时间也传回到前端。
用户输入验证码后,将验证码和时间传到后台。后台先用当前时间减去前台传过来的时间验证是否超时。如果没有超时,就用用户输入的验证码 + 时间 + 自定义秘钥生成MD5值与之前的MD5值比较,如果相等则验证码校验通过,如果不等则说明验证码输入错误校验失败。
原理有点像解方程:
xyz经过一种不可逆运算得到A,将y和A传给用户,z后台保留,用户填写x1后,将x1 y A传回后台,后台再用x1 y z经过不可逆运算得到A1,如果A1和A相等,则验证码校验通过。
前端的实现
本例基于BootStrap,html代码中有BootStrap样式。如果你不想用BootStrap,可以将class样式去掉。效果如图所示。
html代码如下:
<div class="form-group has-feedback"> <input type="tel" class="form-control" id="phone" placeholder="请输入手机号" maxlength=11> <span class="glyphicon glyphicon-earphone form-control-feedback"></span> </div> <div class="row"> <div class="col-xs-6 pull_left"> <div class="form-group"> <input class="form-control" id="msg_num" placeholder="请输入验证码"> </div> </div> <div class="col-xs-6 pull_center"> <div class="form-group"> <input type="button" class="btn btn-block btn-flat" id="verify_refresh" onclick="getMsgNum(this)" value="免费获取验证码"> </div> </div> </div> <div class="col-xs-12 pull_center"> <button type="button" class="btn btn-block btn-flat" onclick="validateNum()">验证</button> </div>
js代码(基于jQuery)
var messageData;
var wait = 120; // 短信验证码120秒后才可获取下一个
/**
* 获取验证码
* @param that
*/
function getMsgNum(that) {
var phoneNumber = $('#phone').val();
setButtonStatus(that); // 设置按钮倒计时
var obj = {
phoneNumber: phoneNumber
};
$.ajax({
url: httpurl + '/sendMsg', // 后台短信发送接口
type: 'POST',
dataType: 'json',
contentType: "application/json",
async: false, //false 同步
data: JSON.stringify(obj),
xhrFields: {
withCredentials: true
},
success: function (result) {
if(result.code == '200') {
messageData = result.data;
}else {
alert("错误码:" + data.code + " 错误信息:" + data.message);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest.status);
console.log(XMLHttpRequest.readyState);
console.log(textStatus);
}
});
}
/**
* 设置按钮状态
*/
function setButtonStatus(that) {
if (wait == 0) {
that.removeAttribute("disabled");
that.value="免费获取验证码";
wait = 60;
} else {
that.setAttribute("disabled", true);
that.value=wait+"秒后可以重新发送";
wait--;
setTimeout(function() {
setButtonStatus(that)
}, 1000)
}
}
/**
* 注册按钮
*/
function validateNum() {
var data = {
msgNum: inputMsgNum,
tamp: messageData.tamp,
hash: messageData.hash
};
$.ajax({
url: httpurl + '/validateNum', // 验证接口
type: 'POST',
dataType: 'json',
contentType: "application/json",
data: JSON.stringify(data),
async: false, //false 同步
success: function (data) {
//业务处理
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest.status);
console.log(XMLHttpRequest.readyState);
console.log(textStatus);
}
});
}
其中setButtonStatus()方法用于设置按钮冷却状态。效果如下图
后台的实现
private static final String KEY = "abc123"; // KEY为自定义秘钥
@RequestMapping(value = "/sendMsg", method = RequestMethod.POST, headers = "Accept=application/json")
public Map<String, Object> sendMsg(@RequestBody Map<String,Object> requestMap) {
String phoneNumber = requestMap.get("phoneNumber").toString();
String randomNum = CommonUtils.createRandomNum(6);// 生成随机数
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
Calendar c = Calendar.getInstance();
c.add(Calendar.MINUTE, 5);
String currentTime = sf.format(c.getTime());// 生成5分钟后时间,用户校验是否过期
sengMsg(); //此处执行发送短信验证码方法
String hash = MD5Utils.getMD5Code(KEY + "@" + currentTime + "@" + randomNum);//生成MD5值
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("hash", hash);
resultMap.put("tamp", currentTime);
return resultMap; //将hash值和tamp时间返回给前端
}
@RequestMapping(value = "/validateNum", method = RequestMethod.POST, headers = "Accept=application/json")
public Map<String, Object> validateNum(@RequestBody Map<String,Object> requestMap) {
String requestHash = requestMap.get("hash").toString();
String tamp = requestMap.get("tamp").toString();
String msgNum = requestMap.get("msgNum").toString();
String hash = MD5Utils.getMD5Code(KEY + "@" + tamp + "@" + msgNum);
if (tamp.compareTo(currentTime) > 0) {
if (hash.equalsIgnoreCase(requestHash)){
//校验成功
}else {
//验证码不正确,校验失败
}
} else {
// 超时
}
}
总结
以上所述是小编给大家介绍的SpringBoot实现短信验证码校验方法思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# spring
# boot
# 短信校验码校验
# SpringBoot 集成Kaptcha实现验证码功能实例详解
# SpringBoot实现前端验证码图片生成和校验
# Springboot实现验证码登录
# SpringBoot发送邮箱验证码功能
# SpringBoot使用邮箱发送验证码实现注册功能
# springboot实现邮箱验证码功能
# SpringBoot发送邮件功能 验证码5分钟过期
# SpringBoot登录验证码实现过程详解
# SpringBoot后端验证码的实现示例
# 验证码
# 自定义
# 请输入
# 小编
# 短信服务
# 随机数
# 在此
# 中有
# 给大家
# 并将
# 如果没有
# 就用
# 再用
# 才可
# 错误信息
# 想用
# 先用
# 有点像
# 机上
# 不正确
相关文章:
宝塔面板如何快速创建新站点?
相册网站制作软件,图片上的网址怎么复制?
建站之星图片链接生成指南:自助建站与智能设计教程
音乐网站服务器如何优化API响应速度?
建站主机类型有哪些?如何正确选型
建站主机系统SEO优化与智能配置核心关键词操作指南
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
购物网站制作公司有哪些,哪个购物网站比较好?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
宿州网站制作公司兴策,安徽省低保查询网站?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
,sp开头的版面叫什么?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
制作证书网站有哪些,全国城建培训中心证书查询官网?
存储型VPS适合搭建中小型网站吗?
定制建站价位费用解析与套餐推荐全攻略
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
如何选择域名并搭建高效网站?
建站之星如何保障用户数据免受黑客入侵?
如何在Windows虚拟主机上快速搭建网站?
网站制作的步骤包括,正确网址格式怎么写?
,如何利用word制作宣传手册?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
设计网站制作公司有哪些,制作网页教程?
宝塔新建站点报错如何解决?
如何通过山东自助建站平台快速注册域名?
如何正确下载安装西数主机建站助手?
如何在自有机房高效搭建专业网站?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
测试制作网站有哪些,测试性取向的权威测试或者网站?
C#怎么创建控制台应用 C# Console App项目创建方法
建站之星导航配置指南:自助建站与SEO优化全解析
如何基于PHP生成高效IDC网络公司建站源码?
图册素材网站设计制作软件,图册的导出方式有几种?
广州商城建站系统开发成本与周期如何控制?
建站主机CVM配置优化、SEO策略与性能提升指南
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
建站之星后台密码遗忘如何找回?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
如何用已有域名快速搭建网站?
C++时间戳转换成日期时间的步骤和示例代码
如何用低价快速搭建高质量网站?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
西安大型网站制作公司,西安招聘网站最好的是哪个?
如何快速搭建高效香港服务器网站?
网站app免费制作软件,能免费看各大网站视频的手机app?
*请认真填写需求信息,我们会在24小时内与您取得联系。