热门标签 | 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短信网关接口实现手机号验证码注册



推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
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社区 版权所有