有关阿里云通信短信服务验证码的发送,请参考我的另一篇文章 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实现短信验证码校验方法思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
本文向大家介绍SpringBoot+Security 发送短信验证码的实现,包括了SpringBoot+Security 发送短信验证码的实现的使用技巧和注意事项,需要的朋友参考一下 在core模块下properties包中创建SmsCodeProperties 在ValidateCodeProperties中new一个SmsCodeProperties对象,并实现getter、setter方法
本文向大家介绍详解iOS 验证码输入的实现思路,包括了详解iOS 验证码输入的实现思路的使用技巧和注意事项,需要的朋友参考一下 如图所示,现在很多App采用了类似下划线、方块等方式的验证码输入,直观美观!对于这种效果的实现方式,大概有以下几种方式: 1.多个UITextField组成 这种方式好处是有光标闪烁、但是在处理删除和动画效果时,就会显得有点笨拙,OFO应该是这样实现的,要严格处理好每个U
本文向大家介绍PHP手机短信验证码实现流程详解,包括了PHP手机短信验证码实现流程详解的使用技巧和注意事项,需要的朋友参考一下 本人在自己博客(Laravel)的注册部分 使用手机号注册,需要发送短信验证码。 使用云片的短信服务提供商,当然具体短信服务提供商大家可以自由选择。 1、实现流程 输入手机号,点击获取验证码 提交正确的短信验证码后,注册完成 2、实现思路图 3、注册 云片,以及开发信息认
本文向大家介绍PHP实现验证码校验功能,包括了PHP实现验证码校验功能的使用技巧和注意事项,需要的朋友参考一下 验证码的校验是利用PHP中的 SESSION功能来实现。 在最顶端声明函数 session_start(); 告诉服务器我们要用这个函数的功能。 接下来我们用到的就是验证码实现的代码。这里用英文数字的代码为例。 然后在验证码实现之前声明一个空变量,用来存放验证码。 用 POST 方式来接
本文向大家介绍iOS实现短信验证码倒计时,包括了iOS实现短信验证码倒计时的使用技巧和注意事项,需要的朋友参考一下 在开发中,经常在需要用户注册的时候会需要实现验证码倒计时的功能,下面是解决这个问题的两种思路(使用UIButton控件) 一、利用NSTimer计时器 1.新建一个UIButton按钮,设置成属性,名为codeButton。(UIButton样式一定要为自定义,否则后面倒计时数秒时会
本文向大家介绍JS实现简单短信验证码界面,包括了JS实现简单短信验证码界面的使用技巧和注意事项,需要的朋友参考一下 1.要实现短信验证码界面,首先要有一个文本框,旁边是按钮,点击时开始倒计时。 2.先创建文本框和按钮,按钮设置对应的id,然后在js中通过id获取按钮这个元素,对其执行操作。同时应设置倒计时时间以及计时器变量,并使点击发送按钮后倒计时结束前无法继续点击按钮重新发送。 3.倒计时结束后