手机短信验证码登录功能的开发实录(机器识别码、短信限流、错误提示、发送验证码倒计时60秒)

news2024/11/28 14:48:16

短信验证码登录功能

  • 项目分析
  • 核心代码
    • 1.外部js库调用
    • 2.HTML容器构建
    • 3.javaScript业务逻辑验证
    • 4.后端验证逻辑
  • 总结

在这里插入图片描述
短信验证码是通过发送验证码到手机的一种有效的验证码系统,作为比较准确和安全地保证购物的安全性,验证用户的正确性的一种手段,几乎网站登录都会使用该方式。
其特点是依据某些验证码接入商提供手机短信验证码服务,各网站通过接口发送请求到接入商的服务器,服务器发送随机数字或字母到手机中,由接入商的服务器统一做验证码的验证。

项目分析

  1. 开通阿里云、腾讯云等短信API端口;
  2. 为防止机器批量发送验证码,设置机器识别码,设置5分钟内发送的次数,进而予以限流;
  3. 发送信息错误时,进行明确的信息提示;
  4. 完成信息验证,执行业务正常逻辑;

核心代码

1.外部js库调用

    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <!--layui封装库-->
    <script src="static/layui/layui.js" charset="utf-8"></script>
    <link rel="stylesheet" href="static/layui/css/layui.css">

2.HTML容器构建

<div style="margin-top: 10px;padding: 20px;">
    <form class="layui-form layui-form-pane">
        <div class="layui-form-item">
            <label for="L_user_phone" class="layui-form-label">手机号码</label>
            <div class="layui-input-inline"><input type="text" id="L_user_phone" name="user_phone" class="layui-input" lay-verify="user_phone"></div>
            <div class="layui-form-mid layui-word-aux"><span class="x-red">* 手机号码,作为登录账户唯一凭证,如:13500000001。</span></div>
        </div>

        <div class="layui-form-item">
            <label class="layui-form-label">识别码</label>
            <div class="layui-input-inline"><input type="text" name="captcha" id="captcha" lay-verify="required" autocomplete="off" class="layui-input"></div>
            <div class="layui-form-mid layui-word-aux"> <img src="?m=Login&a=loginDeal&act=getCode" id="getCode" alt="" title="点击刷新验证码" style="cursor: pointer;"><span class="x-red"> * </span> 发送手机短信验证</div>
        </div>

        <div class="layui-form-item">
            <label class="layui-form-label">短信验证码</label>
            <div class="layui-input-inline"><input type="text" name="smscode" id="smscode" lay-verify="smscode" autocomplete="off" class="layui-input" disabled="disabled"></div>
            <div class="layui-input-inline">
                <input type="button" class="layui-btn layui-btn-primary" id="btnSendCode" disabled="disabled" value="获取验证码">
            </div>
        </div>

        <div class="layui-form-item">
            <button class="layui-btn layui-btn-fluid layui-btn-normal" lay-filter="save" id="L_add" lay-submit=""> 确认登录 </button>
        </div>
    </form>
</div>

3.javaScript业务逻辑验证

  • 验证手机号和短信验证码规则
        //自定义验证规则
        form.verify({
            user_phone: [/^1[3|4|5|6|7|8|9]\d{9}$/, '手机必须11位,只能是数字!']
            , smscode: [/[\S]+/, "验证码为6位数且5分钟内有效"]
        });

  • 机器识别码验证

获取实际图片识别码

    $("#getCode").click(function () {
            $(this).attr("src", '?m=Login&a=loginDeal&act=getCode&' + Math.random());
        });

  • 发送短信验证码倒计时60秒
        var wait = 60;

        function time(o) {
            if (wait == 0) {
                o.removeAttribute("disabled");
                o.value = "获取验证码";
                wait = 60;
            } else {
                o.setAttribute("disabled", true);
                o.value = "重新发送(" + wait + ")";
                wait--;
                setTimeout(function () {
                    time(o);
                }, 1000);
            }
        }
  • 获取识别码和验证码的业务逻辑
 //单击发送验证码;
                document.getElementById("btnSendCode").onclick = function () {
                    var captcha = $("#captcha").val();
                    //获取识别码;
                    $.getJSON("?m=Login&a=loginDeal&act=captcha", {mobile: mobile, captcha: captcha}, function (res) {
                        if (res.code == '0') {
                            layer.msg(res.msg, {icon: 1, time: 2000});
                        } else {
                            if (wait != 60) {
                                layer.alert("请" + wait + "秒后再试!", {icon: 3, time: 2000})
                                return;
                            }
                            time(document.getElementById("btnSendCode"));
                            $.getJSON("?m=Sms&a=smsDeal&act=verify", {
                                mobile: mobile,
                                captcha: captcha
                            }, function (res2) {
                                //console.log(res2.send.Code);
                                if (res2.send.Code != "OK") {
                                    layer.alert("短信限流,请等待5分钟", {icon: 3, time: 2000})
                                }
                            });
                        }
                    });
                }

针对不同平台的业务逻辑,对返回的短信参数进行输出,提示用户操作。

 if (res2.send.Code != "OK") {
   layer.alert("短信限流,请等待5分钟", {icon: 3, time: 2000})
 }
  • 执行业务正常逻辑
 //监听提交;
        form.on('submit(save)', function () {
            $.ajax({
                type: "post",
                url: "?m=Login&a=loginDeal&act=smsCode",
                async: true,
                data: {
                    user_phone: $('#L_user_phone').val(),
                    smscode: $('#smscode').val()
                },
                dataType: "json",
                success: function (res) {
                    //console.log(res);
                    if (res.code == 0) {
                        layer.msg(res.msg, {icon: 1, time: 2000});
                    } else {
                        layer.msg(res.msg, {icon: 1, time: 2000}, function () {
                            var index = parent.layer.getFrameIndex(window.name);
                            parent.layer.close(index);
                            window.parent.location.href = "?m=Index&a=my";
                        });
                    }
                },
                error: function (err) {
                    console.log(err);
                }
            });
            return false;
        });

4.后端验证逻辑

  • 生成随机机器识别码
    case "getCode";
        require_once "libs/vcode.class.php";
        $obj = new vcode();//实例化;
        $_SESSION['authcode'] = $obj->authcode;
        die($obj->output());
        break;

  • 验证机器识别码
  //网站识别码;
    case "captcha";
        $user_phone = get_param('mobile');
        $captcha = isset($_GET["captcha"]) ? trim($_GET["captcha"]) : '';

        if ($captcha != $_SESSION['authcode']) {
            $res['code'] = "0";
            $res['msg'] = "识别码错误";
            die(json_encode_lockdata($res));
        } else {
            $res['code'] = "1";
            $res['msg'] = "识别码通过";
            //验证码自动销毁;
            session_destroy();
            die(json_encode_lockdata($res));
        }
        break;
  • 发送短信流(次数)判断
 case "verify";
        require "libs/api_demo/SmsDemo.php";/*阿里云短信SDK*/
        $rmdCode = rand(111111, 999999);//随机验证码
        $templateCode = 'SMS_165690909';//调用模版
        $signName = '言医';//签名
        $mobile = get_param('mobile');//手机号
        if ($mobile == "") {
            die("越权访问!");
        }

        //增加记录;
        addlogs($mobile, 'smscode', '', time(), getip());

        //读取数据库记录;
        $fromTime = time() - 300;
        $toTime = time();
        $sql = "select log_id FROM " . $db->table('log') . " WHERE 1";
        $sql .= " AND logs = 'smscode' AND log_ip ='" . getip() . "'";
        $sql .= " AND log_time > " . $fromTime . " AND log_time <" . $toTime . "";
        $sql .= " ORDER BY log_id DESC";
        $row = $db->queryall($sql);
        if (count($row) >= 5) {
            $res['code'] = 0;
            $res['msg'] = '5分钟内最多发送5次短信.';
            $res['total'] = count($row);
            die(json_encode_lockdata($res));
        } else {
            $send = SmsDemo::sendSms($mobile, $signName, $templateCode, $rmdCode, '', '', '', '', 1);
            $res['code'] = 1;
            $res['send'] = $send;
            $_SESSION['code'] = $rmdCode;
            die(json_encode_lockdata($res));
        }
        break;

总结

一个简单的手机短信验证码登录,涉及到的方方面面比较多。在发送短信次数的限制上,本系统作为正常的业务逻辑进行判断和限流,同时对于阿里云和腾讯云也有对应的限制规则,需要在平台上进行设置。

@漏刻有时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/474407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redux的基本使用,从入门到入土

目录 一、初步使用Redux 1.安装Redux 2.配置状态机 二、Redux的核心概念 1.工作流程 2.工作流程 三、优化Redux 1.对action进行优化 2.type常量 3.reducer优化 四、react-redux使用 1.安装react-redux 2.全局注入store仓库 3.组件关联仓库 五、状态机的Hook 1.u…

Day958.代码的分层重构 -遗留系统现代化实战

代码的分层重构 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于代码的分层重构的内容。 来看看如何重构整体的代码&#xff0c;也就是如何对代码分层。 一、遗留系统中常见的模式 一个学校图书馆的借书系统。当时的做法十分“朴素”&#xff0c;在点击“借阅”按钮…

如何使用osquery在Windows上实时监控文件?

导语&#xff1a;Osquery是一个SQL驱动操作系统检测和分析工具&#xff0c;它由Facebook创建&#xff0c;支持像SQL语句一样查询系统的各项指标&#xff0c;可以用于OSX和Linux操作系统。 Osquery是一个SQL驱动操作系统检测和分析工具&#xff0c;它由Facebook创建&#xff0c;…

不得不说的行为型模式-责任链模式

目录 责任链模式&#xff1a; 底层原理&#xff1a; 代码案例&#xff1a; 下面是面试中可能遇到的问题&#xff1a; 责任链模式&#xff1a; 责任链模式是一种行为型设计模式&#xff0c;它允许多个对象在一个请求序列中依次处理该请求&#xff0c;直到其中一个对象能够…

【VM服务管家】VM4.0平台SDK_2.5 全局工具类

目录 2.5.1 全局相机&#xff1a;全局相机设置参数的方法2.5.2 全局相机&#xff1a;获取全局相机列表的方法2.5.3 全局通信&#xff1a;通信管理中设备开启状态管理2.5.4 全局通信&#xff1a;接收和发送数据的方法2.5.5 全局变量获取和设置全局变量的方法 2.5.1 全局相机&…

经典重装上阵,更好用的中小手游戏鼠标,雷柏V300W上手

日常办公、玩游戏都需要用到鼠标&#xff0c;特别是对于游戏玩家来说&#xff0c;一款手感好、易定制的鼠标&#xff0c;绝对是游戏上分的利器。早先雷柏出过一款V300鼠标&#xff0c;距今已有10年历史&#xff0c;当时是很受欢迎&#xff0c;最近南卡又出了一款复刻版的V300W&…

为什么不要相信AI机器人提供的健康信息?

自从OpenAI、微软和谷歌推出了AI聊天机器人&#xff0c;许多人开始尝试一种新的互联网搜索方式&#xff1a;与一个模型进行对话&#xff0c;而它从整个网络上学到的知识。 专家表示&#xff0c;鉴于之前我们倾向于通过搜索引擎查询健康问题&#xff0c;我们也不可避免地会向Ch…

linux下的权限管理

1.shell概念 当我们在进入正文前先给大家普及一些基础概念。 广义上来讲&#xff0c;linux 发行版 linux内核 外壳程序&#xff08;这个外壳程序就相当于 windows gui&#xff08;窗口图形&#xff09;&#xff0c;linux 常用的shell 是 bash&#xff09; 所以&#xff0c…

vue基本语法

目录 一、模板语法 &#xff08;1&#xff09;文本 &#xff08;2&#xff09;原始HTML &#xff08;3&#xff09;属性Attribute &#xff08;4&#xff09;使用JavaScript表达式 二、条件渲染 &#xff08;1&#xff09;v-if&#xff0c;v-else &#xff08;2&#x…

nodejs+vue+elementui学生毕业生离校系统

学生毕业离校系统的开发过程中。该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员&#xff1a;首页、个人中心、学生管理、教师管理、离校信息管理、费用结算管理、论文审核管理、管理员管理、留言板管理、系统管理等&#xff0c;前台首页&#xff1b;首页、离…

stm32 CubeMx 实现SD卡/sd nand FATFS读写测试

stm32 CubeMx 实现SD卡/SD nand FATFS读写测试 文章目录 stm32 CubeMx 实现SD卡/SD nand FATFS读写测试1. 前言2. 环境介绍2.1 软硬件说明2.2 外设原理图 3. 工程搭建3.1 CubeMx 配置3.2 SDIO时钟配置说明3.2 读写测试3.2.1 添加读写测试代码 3.3 FATFS文件操作3.3.1 修改读写测…

云计算:数字化转型的利器

随着数字化转型的加速&#xff0c;企业对于信息技术应用的需求越来越大&#xff0c;而云计算作为一种新的基础设施&#xff0c;也逐渐成为了许多企业的首选。那么&#xff0c;云计算究竟有哪些优势&#xff1f;未来发展趋势又是怎样的呢&#xff1f;下面就让我们一起来探讨一下…

深入理解try...catch(字节码层面)

我们工作中常用try...catch来解决程序中出现的异常情况&#xff0c;但是你真的了解它的实现原理吗&#xff1f;今天我就带着大家从字节码层面理解try...catch 一、准备工作 我们首先需要准备好异常类和对应的测试类方便我们观察。 异常类&#xff1a; public class DivideB…

1.软件测试

目录 一、面试重点 1.什么是软件测试&#xff1f; 2.软件测试和软件开发的区别 3.你为什么选择软件测试&#xff1f; 4.什么是需求&#xff1f; 5.软件测试人员如何深入了解需求&#xff1f; 6.什么是内存泄露&#xff1f; 7.什么是测试用例&#xff1f; 8.测试用例有…

【23】linux进阶——linux的软链接和硬链接

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

终于成功了,CCED2000后,中文编程软件再次脱颖而出,系出金山

WPS抗衡微软&#xff0c;CCEDE却被淹没&#xff1f; DOS代&#xff0c;我们用WPS来进行文字编辑&#xff0c;CCED来做表格&#xff0c;两者在那个时代可以称得上是国产办公领域的“必装软件”。 如今&#xff0c;30年过去了&#xff0c;WPS一步一步成长为抗衡微软office的国产…

electron入门 | 手把手带electron项目初始化

Electron是一个基于Chromium和 Node.js&#xff0c;可以使用 HTML、CSS和JavaScript构建跨平台应用的技术框架&#xff0c;兼容 Mac、Windows 和 Linux。 目录 1.了解electron 2.开发环境 3.初始化 采坑插曲&#xff1a; 1.了解electron Electron 可以让你使用纯 JavaScrip…

easyexcel读取excel合并单元格数据

普通的excel列表&#xff0c;easyexcel读取是没有什么问题的。但是&#xff0c;如果有合并单元格&#xff0c;那么它读取的时候&#xff0c;能获取数据&#xff0c;但是数据是不完整的。如下所示的单元格数据&#xff1a; 我们通过简单的异步读取&#xff0c;最后查看数据内容&…

symfonos 2

目录 扫描 SMB SSH 提权 扫描 由于端口80是打开的,我们试图在浏览器中打开IP地址,但在网页上没有找到任何有用的信息。我们还尝试了dirb和其他目录暴力工具,但没有找到任何东西。 SMB 为了进一步枚举,我们使用Enum4Linux工具并找到了一些有用的信息。我们发现了一个名…

Microelectronic学习章节总结(1)-- 计算机架构复习

文章目录 Part1. 处理器架构&#xff0c;以及流水线的实现方法part2 DLX架构part3 ULTRA SPARC T2架构part4 PENTIUM 4架构part5 不同架构之间的性能比较 PPT&#xff1a;2&#xff0c;4&#xff0c;5&#xff0c;6 这一章主要对之前的计算机架构一些知识进行复习&#xff0c;因…