服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|

服务器之家 - 编程语言 - JAVA教程 - SpringBoot实现短信验证码校验方法思路详解

SpringBoot实现短信验证码校验方法思路详解

2020-12-17 14:31喝酒不骑马 JAVA教程

最近做项目遇到这样的需求,前端是基于BootStrap,html代码中有BootStrap样式实现的,具体后台实现代码大家通过本文一起学习吧

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

思路

用户输入手机号后,点击按钮获取验证码。并设置冷却时间,防止用户频繁点击。

后台生成验证码并发送到用户手机上,根据验证码、时间及一串自定义秘钥生成md5值,并将时间也传回到前端。

用户输入验证码后,将验证码和时间传到后台。后台先用当前时间减去前台传过来的时间验证是否超时。如果没有超时,就用用户输入的验证码 + 时间 + 自定义秘钥生成md5值与之前的md5值比较,如果相等则验证码校验通过,如果不等则说明验证码输入错误校验失败。

原理有点像解方程:

xyz经过一种不可逆运算得到a,将y和a传给用户,z后台保留,用户填写x1后,将x1 y a传回后台,后台再用x1 y z经过不可逆运算得到a1,如果a1和a相等,则验证码校验通过。

前端的实现

本例基于bootstrap,html代码中有bootstrap样式。如果你不想用bootstrap,可以将class样式去掉。效果如图所示。

SpringBoot实现短信验证码校验方法思路详解 

html代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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()方法用于设置按钮冷却状态。效果如下图

SpringBoot实现短信验证码校验方法思路详解

后台的实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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实现短信验证码校验方法思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://blog.csdn.net/colton_null/article/details/77283545

延伸 · 阅读

精彩推荐
  • JAVA教程Java编程实现提取文章中关键字的方法

    Java编程实现提取文章中关键字的方法

    这篇文章主要介绍了Java编程实现提取文章中关键字的方法,较为详细的分析了Java提取文章关键字的原理与具体实现技巧,具有一定参考借鉴价值,需要的朋友...

    awj35845872020-01-15
  • JAVA教程浅谈spring security入门

    浅谈spring security入门

    这篇文章主要介绍了浅谈spring security入门,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小...

    知识追寻者4682020-07-09
  • JAVA教程Spring实战之XML与JavaConfig的混合配置详解

    Spring实战之XML与JavaConfig的混合配置详解

    大家都知道Spring的显示配置方式有两种,一种是基于XML配置,一种是基于JavaConfig的方式配置。那么下这篇文章主要给大家分别介绍如何在JavaConfig中引用X...

    杰锅锅4802020-12-02
  • JAVA教程详解Java的JDBC API中事务的提交和回滚

    详解Java的JDBC API中事务的提交和回滚

    这篇文章主要介绍了Java的JDBC API中事务的提交和回滚,JDBC是Java用于和数据库软件连接的API,需要的朋友可以参考下 ...

    goldensun2732020-03-13
  • JAVA教程Struts2学习笔记(4)-通配符的使用

    Struts2学习笔记(4)-通配符的使用

    本文主要介绍Struts2中通配符的使用,简单实用,希望能给大家做一个参考。 ...

    meaijojo4692020-05-14
  • JAVA教程完美解决Eclipse 项目有红感叹号的问题

    完美解决Eclipse 项目有红感叹号的问题

    下面小编就为大家带来一篇完美解决Eclipse 项目有红感叹号的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    jingxian2942020-07-27
  • JAVA教程Java实现人机猜拳游戏

    Java实现人机猜拳游戏

    这篇文章主要为大家详细介绍了Java实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    梦小娴4512020-07-28
  • JAVA教程JAVA中string数据类型转换详解

    JAVA中string数据类型转换详解

    在JAVA中string是final类,提供字符串不可以修改,string类型在项目中经常使用,下面给大家介绍了string七种数据类型转换,需要的朋友可以参考下 ...

    霞想无限好2702019-12-31