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

发布时间 - 2026-01-11 02:49:53    点击率:

有关阿里云通信短信服务验证码的发送,请参考我的另一篇文章   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后端验证码的实现示例  # 验证码  # 自定义  # 请输入  # 小编  # 短信服务  # 随机数  # 在此  # 中有  # 给大家  # 并将  # 如果没有  # 就用  # 再用  # 才可  # 错误信息  # 想用  # 先用  # 有点像  # 机上  # 不正确 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS中配置站点IP、端口及主机头?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Laravel Session怎么存储_Laravel Session驱动配置详解  Bootstrap CSS布局之列表  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  JS经典正则表达式笔试题汇总  如何快速启动建站代理加盟业务?  原生JS获取元素集合的子元素宽度实例  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel如何实现用户密码重置功能?(完整流程代码)  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  如何在橙子建站中快速调整背景颜色?  大连 网站制作,大连天途有线官网?  Laravel如何使用Collections进行数据处理?(实用方法示例)  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  详解CentOS6.5 安装 MySQL5.1.71的方法  用yum安装MySQLdb模块的步骤方法  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  个人网站制作流程图片大全,个人网站如何注销?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何在云主机快速搭建网站站点?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Android自定义listview布局实现上拉加载下拉刷新功能  如何在阿里云香港服务器快速搭建网站?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何在香港免费服务器上快速搭建网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  WordPress 子目录安装中正确处理脚本路径的完整指南  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  java ZXing生成二维码及条码实例分享  Laravel怎么实现验证码(Captcha)功能  文字头像制作网站推荐软件,醒图能自动配文字吗?  linux写shell需要注意的问题(必看)  java中使用zxing批量生成二维码立牌  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  如何在宝塔面板中创建新站点?