前端学习-短信验证码登录

本文详细介绍了短信验证码登录的实现过程,包括配置axios请求、获取表单数据、调用验证码接口、处理成功与失败反馈,以及验证码生成与验证机制。
摘要由CSDN通过智能技术生成

短信验证码登录是我们在项目开发的过程中很常见的一种方式,也是前端与后端接通数据的重要渠道,本文将详细介绍实现的整个流程,希望对大家有所帮助。

由于短信接口不是免费的,为了防止攻击者恶意盗刷,这里仅分享主要的实现流程,在后端将验证码默认为246810

主要步骤

分为以下几个:

1在utils/request.js中配置axios请求基地址

2手机手机号和验证码数据

3基于axios调用验证码登录接口

4使用bootstrap的alert警告框反馈结果给用户

接下来,是详细步骤:

1配置axios请求基地址

axios.defaults.baseURL = 'http://geek.itheima.net';

2封装获取表单数据的函数:

document.querySelector('.btn').addEventListener('click',  ()=> {
  const form = document.querySelector('.login-form')
  const data = serialize(form, { hash: true, empty:true })
  console.log(data)

保存之后,回到控制台,可以看到后台已经成功拿到了表单中提交的数据:

3基于axios调用验证码登录接口

  axios({
    url:'/v1_0/authorizations',
    method:'POST',
    data
  }).then(result => {
    console.log(result)
  }).catch(err => {
    console.dir(error)
  })
  
})

保存之后,可以看到控制台返回的详细信息:

如果验证码没有写对,则会进入 catch,返回错误信息

可以看到它执行了23行的代码:

4提示用户:封装了一个myalert函数,通过传入不同的参数,判断执行结果

function myAlert(isSuccess, msg) {
  const myAlert = document.querySelector('.alert')
  myAlert.classList.add(isSuccess ? 'alert-success' : 'alert-danger')
  myAlert.innerHTML = msg
  myAlert.classList.add('show')

  setTimeout(() => {
    myAlert.classList.remove(isSuccess ? 'alert-success' : 'alert-danger')
    myAlert.innerHTML = ''
    myAlert.classList.remove('show')
  }, 2000)
}

当登录成功时调用函数,传入true,返回

myAlert(true,'登录成功')

当登录失败时调用函数,传入false,返回错误信息

 myAlert(false,error.response.data.message)

原理解释

登录流程:手机号+验证码

1当用户输入手机号时,点击获取验证码,

2浏览器向服务器发起短信验证码接口请求,这个请求需要携带手机号,

3服务器收到请求后,为此手机号生成一个随机验证码,记录生成时间,并保存在服务器,

4服务器携带手机号和验证码调用运营商接口

5运营商接口通过部署在全国各地的基站向给定手机号发送验证码信息(无连接,只负责发送即可,不需要等待手机返回已收到的结果),紧接着,运营商就会发送验证码发送成功的信息给到服务器,服务器知道运营商已经成功发送信息给了用户,然后就会把请求发送的响应结果提示给用户,告诉前端验证码已经发送成功了,并开始倒计时,用户拿出手机,等待收到验证码,等待时间长短与时延有关,用户收到验证码后,将验证码填入到页面指定位置,

那么,这个验证码究竟是不是正确的?谁知道呢?是后端。这时,当用户点击登录时,前端会向服务器发送一个调用验证码登录的接口请求,这个请求需要携带手机号和验证码,这时,服务器就会根据收到的手机号和验证码跟生成的验证码进行对比,对比接收的时刻和生成的时刻有没有超过一个规定的时间,对比之后,返回一个登录成功或者失败的结果给前端,前端将这个结果通过js代码的方式反馈给用户,用户就知道自己有没有登录成功了。

好啦,以上就是短信验证码登录的整个流程,下期文章见~

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要实现短信验证码登录,需要以下步骤: 1. 前端页面中添加手机号码输入框和获取验证码按钮。 2. 用户输入手机号码后,点击获取验证码按钮,前端发送请求到后端获取验证码。 3. 后端接收到请求后,生成随机验证码,并将验证码保存到缓存中,同时调用短信接口将验证码发送给用户。 4. 用户输入收到的验证码后,前端将手机号码和验证码发送到后端进行验证。 5. 后端从缓存中获取对应手机号码的验证码进行比对,如果验证码正确,则返回登录成功的信息。 下面是Java实现短信验证码登录的示例代码: 1. 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.0</version> </dependency> ``` 2. 在后端代码中添加以下方法: ```java // 发送短信验证码 public boolean sendSmsCode(String phoneNumber) { // 生成随机验证码 String code = String.valueOf((int)((Math.random()*9+1)*100000)); // 将验证码保存到缓存中,有效期为5分钟 // 这里使用redis作为缓存,需要自行安装redis并添加依赖 redisTemplate.opsForValue().set(phoneNumber, code, 5, TimeUnit.MINUTES); // 调用阿里云短信接口发送验证码 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "accessKeyId", "accessSecret"); IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest(); request.setMethod(MethodType.POST); request.setDomain("dysmsapi.aliyuncs.com"); request.setVersion("2017-05-25"); request.setAction("SendSms"); request.putQueryParameter("PhoneNumbers", phoneNumber); request.putQueryParameter("SignName", "短信签名"); request.putQueryParameter("TemplateCode", "短信模板ID"); request.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}"); try { CommonResponse response = client.getCommonResponse(request); String result = response.getData(); // 判断短信是否发送成功 JSONObject jsonObject = JSON.parseObject(result); if (jsonObject.get("Code").toString().equals("OK")) { return true; } return false; } catch (Exception e) { e.printStackTrace(); return false; } } // 验证短信验证码 public boolean verifySmsCode(String phoneNumber, String code) { // 从缓存中获取对应手机号码的验证码 String smsCode = (String) redisTemplate.opsForValue().get(phoneNumber); // 比对验证码是否正确 if (smsCode != null && smsCode.equals(code)) { return true; } return false; } ``` 3. 在Controller中添加以下接口: ```java // 发送短信验证码 @RequestMapping(value = "/sendSmsCode", method = RequestMethod.POST) public Result sendSmsCode(@RequestParam("phoneNumber") String phoneNumber) { boolean isSuccess = userService.sendSmsCode(phoneNumber); if (isSuccess) { return Result.success("短信验证码发送成功"); } else { return Result.fail("短信验证码发送失败"); } } // 短信验证码登录 @RequestMapping(value = "/loginBySmsCode", method = RequestMethod.POST) public Result loginBySmsCode(@RequestParam("phoneNumber") String phoneNumber, @RequestParam("code") String code) { // 验证短信验证码是否正确 boolean isVerified = userService.verifySmsCode(phoneNumber, code); if (isVerified) { // 验证通过,返回登录成功的信息 return Result.success("登录成功"); } else { // 验证失败,返回登录失败的信息 return Result.fail("验证码错误"); } } ``` 4. 在前端页面中添加以下代码: ```html <!-- 手机号码输入框 --> <input type="text" id="phoneNumber" placeholder="请输入手机号码"> <!-- 获取验证码按钮 --> <button onclick="sendSmsCode()">获取验证码</button> <!-- 短信验证码输入框 --> <input type="text" id="smsCode" placeholder="请输入短信验证码"> <!-- 登录按钮 --> <button onclick="loginBySmsCode()">登录</button> <script> // 发送短信验证码 function sendSmsCode() { var phoneNumber = $("#phoneNumber").val(); $.ajax({ type: "POST", url: "/sendSmsCode", data: { "phoneNumber": phoneNumber }, success: function (result) { alert(result.message); }, error: function () { alert("发送短信验证码失败"); } }); } // 短信验证码登录 function loginBySmsCode() { var phoneNumber = $("#phoneNumber").val(); var smsCode = $("#smsCode").val(); $.ajax({ type: "POST", url: "/loginBySmsCode", data: { "phoneNumber": phoneNumber, "code": smsCode }, success: function (result) { alert(result.message); }, error: function () { alert("短信验证码登录失败"); } }); } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学英语的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值