手机验证码接收注册新账户

在写注册的时候想使用手机号进行验证,用来保证用户的安全性操作,因为以前使用的是邮箱验证,太麻烦了。所以在网上找到了一个比较好的第三方提供短信送达服务,有的还需要企业用户认证,这里我选择的是网易云的短信服务。试了下,速度还不错,基本三秒左右就可以收到短信。这是网址https://www.163yun.com/product/sms,点击免费试用就可以了。


先说下整个模块的步骤:

  • 前端出发获取验证码,同时开始倒计时
  • 后台通过代理平台发送验证码信息
  • 用户提交表单后,在后台进行验证码的验证

项目的整个文档结构如下图:可以在文章最后的连接中下载项目文件:

这里写图片描述


下面详细介绍具体功能的实现


一、前台页面

首先本文的例子是通过springmvc实现的,所以要先把基本的配置搭好,然后先是写好前端界面。如下图所示(界面有点简单,将就着看,重在实现)


这里写图片描述

代码如下:

<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="../static/js/register.js"></script>
</head>
<body>
<div><form action="validation" method="post"><div align="left">手机号:<input id="phone" name="phone" class="phone" type="number"><br><hr>验证码:<input  id="verification" name="verification" type="number"><input type="button" value="获取验证码" name="yzm" class="yzm" disabled="disabled"><br><br><input type="submit" id="submit" value="提交"></div></form></div>
</body>
</html>

还有我们的js代码,这里使用的jQuery,所以jsp页面头要引入jQuery。js已经写了注释,有不明白的可以搜索下

$(document).ready(function(){var ordertime=20   //设置再次发送验证码等待时间var timeleft=ordertimevar btn=$(".yzm")var phone=$(".phone")var telvar reg = /^1[0-9]{10}$/;  //电话号码的正则匹配式phone.keyup(function() {if (reg.test(phone.val())) {tel = phone.val()btn.removeAttr("disabled") //当号码符合规则后发送验证码按钮可点击} else {btn.attr("disabled", true)}})//计时函数function timeCount() {timeleft -= 1if (timeleft > 0) {btn.val(timeleft + " 秒后重发");setTimeout(timeCount, 1000)} else {btn.val("重新发送");timeleft = ordertime //重置等待时间btn.removeAttr("disabled");}}//事件处理函数btn.on("click", function() {$(this).attr("disabled", true); //防止多次点击timeCount(this);var paras = "o_tel="+tel;//此处为向后台的请求,获取验证码$.post('http://localhost:8080/Phone_verification/login/sendCode?'+paras,function(data) {if(data!=null&&typeof(data)!="undefined"){var msg = data.msg;  //返回值为json格式if(msg!=null&&typeof(msg)!="undefined"&&msg=="SUCCESS"){}else{alert("短信验证码发送失败!请重新获取。");}}else{alert("短信验证码发送失败!请重新获取。");}},"json");});});

二、后台处理

后台接收到js的请求后调用相应的controller ,sendCode方法,方法中实现了对前台数据中的手机号,然后通过调用网易云实例中给代码,给平台发送HTTP请求,接入短信接口。
其中重要的有四个参数需要根据自己网易云控制台中的信息进行修改,分别是

  • AppKey:开发者平台分配的appkey
  • Nonce:这个我已经通过controller生成了随机数
  • CurTime:当前UTC时间戳,从1970年1月1日0点0 分0 秒开始到现在的秒数(String)
  • CheckSum:SHA1(AppSecret + Nonce + CurTime),三个参数拼接的字符串,进行SHA1哈希计算,转化成16进制字符(String,小写)

其中Appkey,Appsecret获取步骤:

  • 成为云信开发者
  • 登录云信管理后台(http://app.netease.im/login)
  • 创建应用
  • 打开App Key管理

下面是sendCode()方法的具体代码:

@RequestMapping(value="/sendCode",method={RequestMethod.POST,RequestMethod.GET})public String sendCode(HttpServletRequest request,HttpServletResponse response) throws Exception{String ret="";String o_tel = request.getParameter("o_tel");//获取前端传送过来的电话号码if(o_tel!=null&&o_tel!=""){int Random  = (int) ((Math.random()*9+1)*100000);//随机生成的6位数(验证码)//调用封装的工具类SendCode  返回验证码SendCode s = new SendCode();verification = s.send(o_tel, Random);if(verification != null){ret = "{\"msg\":\"SUCCESS\"}";}else{ret = "{\"msg\":\"ERROR\"}";}}else{ret = "{\"msg\":\"ERROR\"}";}response.setContentType("application/json;charset=UTF-8");PrintWriter writer = null;try {writer = response.getWriter();} catch (IOException e) {e.printStackTrace();}writer.write(ret);//推送回前端return null;}

其中SendCode 类为:调用的getCheckSum(),我这里直接使用的是网易云实例文档中计算CheckSum的java代码。

package tool;import java.util.ArrayList;
import java.util.Date;
import java.util.List;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;/*** 发送验证码* @author liuxuanlin**/
public class SendCode {//发送验证码的请求路径URLprivate static final StringSERVER_URL="https://api.netease.im/sms/sendcode.action";//网易云信分配的账号,请替换你在管理后台应用下申请的Appkeyprivate static final String APP_KEY="**********************";//网易云信分配的密钥,请替换你在管理后台应用下申请的appSecretprivate static final String APP_SECRET="**********";//短信模板IDprivate static final String TEMPLATEID="******";//验证码长度,范围4~10,默认为4private static final String CODELEN="6";public String send(String MOBILE,int Random) throws Exception {DefaultHttpClient httpClient = new DefaultHttpClient();HttpPost httpPost = new HttpPost(SERVER_URL);String curTime = String.valueOf((new Date()).getTime() / 1000L);/** 参考计算CheckSum的java代码,在上述文档的参数列表中,有CheckSum的计算文档示例*/String NONCE = String.valueOf(Random);String checkSum = CheckSumBuilder.getCheckSum(APP_SECRET, NONCE, curTime);// 设置请求的headerhttpPost.addHeader("AppKey", APP_KEY);httpPost.addHeader("Nonce", NONCE);httpPost.addHeader("CurTime", curTime);httpPost.addHeader("CheckSum", checkSum);httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");// 设置请求的的参数,requestBody参数List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("templateid", TEMPLATEID));nvps.add(new BasicNameValuePair("mobile", MOBILE));nvps.add(new BasicNameValuePair("codeLen", CODELEN));httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));// 执行请求HttpResponse response = httpClient.execute(httpPost);/** 1.打印执行结果,打印结果一般会200、315、403、404、413、414、500* 2.具体的code有问题的可以参考官网的Code状态表*/String result = EntityUtils.toString(response.getEntity(), "utf-8");String verification =  result.split("\"")[9];System.out.println("验证码发送成功!");return verification;}
}

这个是跳转到主页的controller:

@RequestMapping(value="/index")public String send(){return "index";}

最后就是对提交上的form表单中的验证码进行验证,这里我讲form表单中的数据封装到一个POJO中,然后对比验证码进行注册是否成功。

@RequestMapping(value="/validation")//将前台界面form表单中的数据放入Phone类中//当获取不是POJO里面的参数的时候使用@RequestParam获取。public String login(@ModelAttribute("form") Phone phone){/** 验证数据System.out.println("验证码为:"+verification);System.out.println(phone.getPhone()+"------"+phone.getVerification());*///对验证码进行判断后跳转到相应的界面中if(phone.getVerification().equals(verification)){return "success";}else{return "failure";}}

以上就是注册时对手机发送短信的具体验证的实现,核心内容上面都已经介绍的差不多了,代码有些粗糙,大家可以再修改下,如果是配置上出现错误可以看我上传到CSDN的项目文件对比下。

最后,如果文中如果出现了什么不足之处,还望指点与纠正。

文件下载地址:http://download.csdn.net/detail/leoe_/9895443

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我看CHATGPT: 为啥谷歌掉了千亿美金

两个月前&#xff0c;我试着想用 ChatGPT 帮我写篇文章《eBPF 介绍》&#xff0c;结果错误百出&#xff0c;导致我又要从头改一遍&#xff0c;从那天我觉得 ChatGPT 生成的内容完全不靠谱&#xff0c;所以&#xff0c;从那天开始我说我不会再用 ChatGPT 来写文章&#xff08;这…

chat聊天程序

服务端: package cs;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.*; import java.net.ServerSocket; import …

多家游戏交易平台发声,禁止未成年人买号租号

游戏租号绕开防沉迷系统事件迎来下文。9 月7 日&#xff0c;DD3737、交易猫、5173 等游戏交易平台相继发布声明&#xff0c;已采取严格措施禁止任何未成年人利用游戏交易平台买卖和租赁游戏账号。 同时&#xff0c;上述游戏交易平台还呼吁&#xff1a;游戏出版、发行、运营、交…

Vue3 TS setup 引入 markmap 思维导图,通过markdown解析成思维导图,集成到自己项目中

【前言】%&#xff08;&&#xff08;&……&#xff08;&#xff09;* 最近刚好做了个项目&#xff0c;给大家分享一个Vue3 TS setup 如何引入 markmap 思维导图,markmap可以通过markdown解析成思维导图。我们如何将它集成到自己项目中&#xff1f; 【看图】还是先看图…

一文学会:使用ChatGPT做XMind思维导图

先下载工具&#xff1a;XMind工具下载 假设我现在是一个小白&#xff0c;我想入行人工智能&#xff0c;我想让ChatGPT帮我生成一个学习路线&#xff0c;并做成思维导图的形式&#xff0c;那首先&#xff0c;我要告诉ChatGPT我想要的主题是什么 Prompt1:“我是一个大学生&#x…

ChatGPT4:智能化聊天工具,为你的生活带来更高效、便捷和多样化的聊天体验

随着时代的发展&#xff0c;人们的生活越来越快节奏化&#xff0c;工作压力越来越大。因此&#xff0c;他们需要一个智能化、高效率的聊天工具&#xff0c;来更好地完成工作和娱乐。恰巧&#xff0c;ChatGPT4是这样的一款聊天工具&#xff0c;它通过人工智能技术能够与用户进行…

AI_News周刊:第一期

2023.02.06—2023.02.12 关于ChatGPT的前言&#xff1a; 在去年年末&#xff0c;OpenAI的ChatGPT在技术圈已经火了一次&#xff0c;随着上周它的二次出圈&#xff0c;ChatGPT算得上是人工智能领域的一颗明星&#xff0c;它在聊天机器人领域有着不可忽视的影响力。其准确、快速…

九龙证券|突然哑火!最火爆中小盘明显回调,后市咋走?机构最新解读

中证1000和国证2000指数创年内新高后&#xff0c;连续2日回调。 2月17日A股商场震动下行&#xff0c;创业板指数跌幅超2%&#xff0c;近3000只个股跌落&#xff0c;北向资金小幅净流入&#xff0c;商场成交额接近万亿关口&#xff0c;港股也出现显着回调痕迹。 以中小市值公司…

java程序员应聘优秀简历

年 龄&#xff1a;22 姓 名&#xff1a;___ 性 别&#xff1a;男 联系电话&#xff1a;____ 联系邮箱&#xff1a;____ 现住址&#xff1a; 专 业&#xff1a;计算机网络与电子商务 择业目标 Java软件工程师 基于Oracle数据库&#xff0c;MySQL数据库&#xff0c;Web应用的Java…

理性和感性 - 如何对待错误

上次的博客&#xff0c; 我写了一些关于 软件开发中的理性和感性决定 的故事。 不论是感性还是理性&#xff0c;我们的目的就是要把软件交给用户去用&#xff0c; 在软件行业中有这样一句俗话&#xff1a; 当你把产品交给用户的时候&#xff0c;你的学习才刚刚开始。 当然每个团…

【考研】关于联系导师的经验分享--目标院校:西北工业大学

前面的前面 今天打开了我的csdn&#xff0c;突然发现2019年发过的一篇问答稿竟然帮助了那么多人&#xff0c;我平时都是在csdn上搜问题&#xff0c;也没有想过分享。所以就想以后要多在这里记录我的经验了&#xff0c;方便自己也帮助他人~ 这是一篇尘封已久的经验稿&#xff…

怎么才能优雅地向导师表达「这周科研没什么进展」?

本文来源&#xff1a;知乎 大家讨论下&#xff1a;怎么才能优雅地向导师表达「这周科研没什么进展」&#xff1f; 导师看你做实验时 当你开组会时&#xff0c;用力屏住呼吸&#xff0c;心虚地躲在角落里。 高赞回复一 作者&#xff1a;FF LIU 1.模型已经基本搭建好&#xff0c;…

【学术相关】读研究生,从学会「拒绝」导师开始

自从进了实验室&#xff0c;自己就一头扎进文献的海洋中&#xff0c;偶尔出来透透气&#xff0c;接触最多的就是课题组的其他难兄难弟和导师。 导师、师门之间的种种联系细致而微妙。 今天小研和大家谈谈&#xff1a;如何拒绝别人。 1.为什么要谈「拒绝」 好多研究生都有这样的…

android耗电怎么解决方法,android os 耗电 严重问题及委婉解决方法

华为系统有个毛病&#xff0c;不管什么版本&#xff0c;不管是官方还是优化的&#xff0c;从2.3版本到现在的4.0&#xff0c;使用一段时间后就会大大的增加耗电量&#xff0c;表现为耗电排行中的“android os”耗电严重&#xff0c;遥遥领先其他硬件。这个问题是属于除了刷机无…

考研复试!电话联系导师须要注意什么呢?

在准备复试其中一项便是联系导师&#xff0c;用电话联系导师是大众考生选择的方式之一。那用电话联系导师有哪些注意事项需要关注呢&#xff1f;一起来了解一下。 电话联系导师须要注意什么呢? 如果你一定要打电话&#xff0c;可以参照如下的流程&#xff1a; (1)提前准备与导…

愤怒!竟然还有学校还在教 Java 的 Swing

昨天&#xff0c;有个读者私信我说&#xff0c;“老师正在教 Swing&#xff0c;这个知识点还需要学习吗&#xff1f;” 说句实在话&#xff0c;刚看到这个问题的时候&#xff0c;我是想骂娘的&#xff01;不是骂读者啊&#xff0c;你懂得&#xff0c;骂学校&#xff0c;骂老师。…

现代软件工程 — 第三部分:文档

https://document360.com/blog/technical-documentation/ 文档是一个常年有争议的话题&#xff0c;因为根据我的经验&#xff0c;软件工程非常注重像源代码和运输功能这样的人工制品的商业价值&#xff0c;而不是其他。我经常听到有人说&#xff0c;我们应该只写敏捷实践中需要…

Go与神经网络:张量运算

0. 背景 2023年年初&#xff0c;我们很可能是见证了一次新工业革命的起点&#xff0c;也可能是见证了AGI(Artificial general intelligence&#xff0c;通用人工智能)[1]孕育的开始。ChatGPT应用以及后续GPT-4大模型的出现&#xff0c;其震撼程度远超当年AlphaGo战胜人类顶尖围…

Chat客服入门案例|商务智能对话客服(二)

ChatGPT是人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具&#xff0c;使用了Transformer神经网络架构&#xff0c;也是GPT-3.5架构&#xff0c;这是一种用于处理序列数据的模型&#xff0c;拥有语言理解和文本生成能力&#xff0c;尤其是它会通过连接…