热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用HttpClient短信网关接口实现手机号验证码注册

确保手机号正确,利用短信网关接口发送验证码,判断验证码一致步骤:1、导入HttpClient的依赖:httpclient4.5.5.jar2、reg页面的js(判断手机号是否为空,

技术图片

确保手机号正确,利用短信网关接口发送验证码,判断验证码一致

步骤:

1、导入HttpClient的依赖:httpclient4.5.5.jar

2、reg页面的js(判断手机号是否为空,手机号的正确性,ajax发送phone的value异步请求,返回json是否符合)

3、controller层编写获取手机号返回json信息

4、在UserServiceImpl中,根据phone调用httpClient网关接口  ***

  准备UserServiceImpl中需要的

  实体类:返回前端的json类、前端传输过来的实体类

  工具类:将数据实体类存入session的工具类、时间常量类、计算时间类、随机验证码类

5、在controller中判断session中的phone并且验证码是否与页面传输的一致,true运行注册

保证手机号的有效性


 具体实现:

1、导入HttpClient的依赖



<dependency>
<groupId>org.apache.httpcomponentsgroupId>
<artifactId>httpclientartifactId>
<version>4.5.5version>
dependency>

2、reg页面的js的编写


/* 短信验证码验证 */
$(
"body").on("click", "#getPhoneCheckCode", function () { //新添加的,也有效
var formId = ‘form_register‘;
var value = $.trim($("#" + formId + " input[name=‘telephone‘]").val());
var errTag = $("#error");
errTag.html(
"");
var length = value.length;
if (length == 0) {
errTag.html(
"请输入手机号码");
}
else {
var mobile = /^1[3,4,5,6,7,8,9]\d{9}$/;
if (!mobile.test(value)) {
errTag.html(
"请输入正确的手机号码");
}
else {
$(
"#getPhoneCheckCode").addClass(‘disabled‘);
$(
"#getPhoneCheckCode").prop(‘disabled‘, true);
$.ajax({
url:
"/house/sendCheckCode",
type:
"post",
cache:
false,
dataType:
‘json‘,
data: { phone: value },
success:
function (msg) {
if (msg.status) {
errTag.text(
‘验证码已发送到您的手机‘);
var time = 60;
var t = setInterval(function () {
$(
"#getPhoneCheckCode").text(time + "S后重新获取");
time
--;
if (time == 0) {
clearInterval(t);
$(
"#getPhoneCheckCode").text("获取验证码");
$(
"#getPhoneCheckCode").prop(‘disabled‘, false);
$(
"#getPhoneCheckCode").removeClass(‘disabled‘);
}
},
1000);
}
else {
errTag.text(
‘未知错误‘);
}
}
});
}
}
});

3、controller层编写获取手机号返回json信息


//发送验证码
@PostMapping("/sendCheckCode")
@ResponseBody
public JSONResult sendCheckCode(String phone) throws Exception{
JSONResult jsonResult
= userService.sendCode(phone);
System.out.println(jsonResult.isStatus());
return jsonResult;
}

4、编写业务层前需要做的准备

①json返回数据的对象类(是否成功、显示信息)


public class JSONResult {
private boolean status = true;//表示成功
private String msg;//显示消息

②前端传过来的信息(手机号、验证码,最后一次点击发送验证码的时间)


public class VerifyCodeVo {
/**手机号码*/
private String phone;
/**验证码*/
private String verifyCode;

/**最后一次发送时间*/
private Date lastTime;

③操作session域的工具类,用于将前端传过来的信息保存在session中


public class UserContext {
//定义一个session名称的常量
public static final String VERIFY_CODE_IN_SESSION = "verifyCodeInSession";

//得到httpsession
private static HttpSession getSession() {
//SpringMVC 提供一个RequestContextHolder工具类, 得到Http Servlet API: request,response,session
return ((ServletRequestAttributes)(RequestContextHolder.getRequestAttributes())).getRequest().getSession();
}

//创建一个session对象
public static void setVerifyCode(VerifyCodeVo verifyCodeVo) {
getSession().setAttribute(VERIFY_CODE_IN_SESSION, verifyCodeVo);
}

//获取session对象
public static VerifyCodeVo getCurrentVerifyCode() {
return (VerifyCodeVo) getSession().getAttribute(VERIFY_CODE_IN_SESSION);
}
}

④编写一个常量类,用于存放设置下一次运行发送验证码的时间、验证码有效时间


public class SystemConstant {
/**发送验证码的时间间隔: 单位:秒*/
public static final int BETWEEN_SEND_TIME = 60;
/**验证码的有效时间: 5分钟*/
public static final int VERIFYCODE_VALIDATE_TIME=5*60;

⑤编写一个时间工具类,用于计算当前时间减去上一次点击的时间,判断是否允许发送


public class DateUtils {
public static long betweenTime(Date d1, Date d2) {
return Math.abs((d1.getTime() - d2.getTime())/1000);
}

⑥编写一个随机数工具类,随机生成指定位数验证码


public class RandomUtils {
public static String randomNumber(int length) {
String num
= Math.random()+"";
return num.substring(2, length+2);
}

5、在UserServiceImpl中,根据phone参数调用httpClient网关接口


//发送验证码
@Override
public JSONResult sendCode(String phone) throws Exception {
//创建一个JSONResult对象,用于返回数据
JSONResult jsOnResult= new JSONResult();
//获取存在session中的手机短信信息(手机号,验证码,发送时间)
VerifyCodeVo currentVerify = UserContext.getCurrentVerifyCode();
//1.判断时间间隔大于BETWEEN_SEND_TIME. 大于: 表示可以发送
//等于空表示是第一次点击,允许发送
//当前时间减去上一次发送的时间 如果大于,验证码的有效时间,可以发送
if(currentVerify == null ||
DateUtils.betweenTime(
new Date(), currentVerify.getLastTime()) > SystemConstant.VERIFYCODE_VALIDATE_TIME){

//发送,使用HttpClient发送, 发送的post
//1.创建客户端
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
//2. 准备参数
URI uri = null;
List
params = new ArrayList<>();
params.add(
new BasicNameValuePair("Uid", "xiao"));//jing2672711802
params.add(new BasicNameValuePair("Key", "d41d8cd98f00b204e980"));
params.add(
new BasicNameValuePair("smsMob", phone));
//随机生成的短信验证码,自定义长度为4位
String verifyCode = RandomUtils.randomNumber(4);
params.add(
new BasicNameValuePair("smsText", "发给胡老师:验证码"+verifyCode+"【我的小宝贝】"));

uri
= new URIBuilder().setScheme("http")
.setHost(
"utf8.api.smschinese.cn/")
.setParameters(params)
.build();
//3.创建一个HttpPost请求
HttpPost httpPost = new HttpPost(uri);
//4.发送请求
CloseableHttpResponse httpRespOnse= httpClient.execute(httpPost);
HttpEntity entity
= httpResponse.getEntity();
int result = Integer.parseInt(EntityUtils.toString(entity));
if(result<= 0) { //发送失败
throw new RuntimeException("调用短信网关出错了,错误代码:"+result);
}
else {
//发送成功,把验证码信息保存到session
VerifyCodeVo verifyCodeVo = new VerifyCodeVo();
verifyCodeVo.setPhone(phone);
verifyCodeVo.setVerifyCode(verifyCode);
verifyCodeVo.setLastTime(
new Date());
UserContext.setVerifyCode(verifyCodeVo);
}
if (httpResponse != null) {
httpResponse.close();
}
if (httpClient != null) {
httpClient.close();
}
}
else {
//小于, 不能发送
jsonResult.setStatus(false);
}
return jsonResult;
}

 

使用HttpClient短信网关接口实现手机号验证码注册



推荐阅读
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • Bootstrap 缩略图展示示例
    本文将展示如何使用 Bootstrap 实现缩略图效果,并提供详细的代码示例。 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • 本文介绍了 AngularJS 中的 $compile 服务及其用法,通过示例代码展示了如何使用 $compile 动态编译和链接 HTML 元素。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • ZooKeeper 入门指南
    本文将详细介绍ZooKeeper的工作机制、特点、数据结构以及常见的应用场景,包括统一命名服务、统一配置管理、统一集群管理、服务器动态上下线和软负载均衡。 ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 数字资产量化交易通过大数据分析,以客观的方式制定交易决策,有效减少人为的主观判断和情绪影响。本文介绍了几种常见的数字资产量化交易策略,包括搬砖套利和趋势交易,并探讨了量化交易软件的开发前景。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
author-avatar
手机用户2502883501
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有