发送短信验证码的原理

来源:互联网 发布:张靓颖 冯轲 知乎 编辑:程序博客网 时间:2024/05/21 19:38

本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能。

发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过sessionid判断对应的session,用户输入的验证码再与session记录的验证码进行比较。

为了防止有广告嫌疑这里就不说短信平台是哪个了。

一般的第三方短信平台都会有他们自己的短信接口,只要读懂他们的接口稍作稍作改变就能满足自己的需求。

首先将短信平台接口代码列出:这里要下载三个jar包commons-logging-1.1.1.jar,commons-httpclient-3.1.jar,commons-codec-1.4.jar

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
importjava.io.UnsupportedEncodingException;
importorg.apache.commons.httpclient.Header;
importorg.apache.commons.httpclient.HttpClient;
importorg.apache.commons.httpclient.NameValuePair;
importorg.apache.commons.httpclient.methods.PostMethod;
publicclass SendMsg_webchinese {
publicstatic void main(String[] args)throwsException
{
HttpClient client = newHttpClient();
PostMethod post = newPostMethod("http://gbk.sms.webchinese.cn"); //该第三方短信服务地址
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
NameValuePair[] data ={ newNameValuePair("Uid","本站用户名"),newNameValuePair("Key","接口安全秘钥"),newNameValuePair("smsMob","手机号码"),newNameValuePair("smsText","验证码:8888")};
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
intstatusCode = post.getStatusCode();
System.out.println("statusCode:"+statusCode);
for(Header h : headers)
{
System.out.println(h.toString());
}
String result = newString(post.getResponseBodyAsString().getBytes("gbk"));
System.out.println(result);//打印返回消息状态
post.releaseConnection();
}
}

不难看出,我们想要发送的信息是在这行代码里面:NameValuePair[] data ={ new NameValuePair("Uid", "本站用户名"),new NameValuePair("Key", "接口安全秘钥"),new NameValuePair("smsMob","手机号码"),new NameValuePair("smsText","验证码:8888")};

该接口中还有一个result信息,它的作用是告诉用户短信发送的状态,1表示发送成功,其他的小于0的为失败,这里只要知道1是成功即可。

我们实际的操作中,验证码肯定是要我们自己生成的。将result信息与验证码一起得到,于是很容易想到用一个HashMap集合。下面是以项目自己的需求对接口的更改:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
importjava.util.HashMap;
importorg.apache.commons.httpclient.Header;
importorg.apache.commons.httpclient.HttpClient;
importorg.apache.commons.httpclient.NameValuePair;
importorg.apache.commons.httpclient.methods.PostMethod;
importcom.yuetile.utils.VerifyingCodeGenerator;
publicclass SendMsg_webchineseController {
publicstatic HashMap<String,String> getMessageStatus(String phone)throwsException{
HashMap<String,String> m=newHashMap<String,String>();
HttpClient client = newHttpClient();
PostMethod post = newPostMethod("http://gbk.sms.webchinese.cn");
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
String code=VerifyingCodeGenerator.generate();//验证码
NameValuePair[] data ={ newNameValuePair("Uid","****"),newNameValuePair("Key","******"),newNameValuePair("smsMob",phone),newNameValuePair("smsText","您正在注册本站会员,本次验证码为:"+code+""+"有效时间为5分钟")};
m.put("code", code);
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
intstatusCode = post.getStatusCode();
System.out.println("statusCode:"+statusCode);
for(Header h : headers)
{
System.out.println(h.toString());
}
String result = newString(post.getResponseBodyAsString().getBytes("gbk"));
System.out.println(result);//打印返回消息状态
m.put("result", result);
post.releaseConnection();
returnm;
}
}

***表示的是在第三方平台注册的账号密码。

ACTION层:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* @author hang
* @Decription 注册,发送短信验证码,保存到Session中
* @param 封装客户端请求 POST
* @return 返回状态参数
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = UrlDefine.Register.CHECKMESSAGEWORK, method = RequestMethod.POST)
publicObject SendCheckMessage(HttpServletRequest request, @RequestBodyUserBean u)
throwsException {
String message = "发送成功";
String phone=u.getTelephone(); //获取到客户端发来的手机号
UserBean user = userService.getByPhone(phone);
if(user != null) {
message = "该手机号已被注册";
returnnew Response(Status.ERROR, message);
}else{
HashMap<String, String> m = SendMsg_webchineseController.getMessageStatus(phone); //应用发送短信接口
String result = m.get("result"); //获取到result值
if(result.trim().equals("1")) {  //如果为1,表示成功发送
String code = m.get("code"); //获取发送的验证码内容
logger.info("发送的验证码:"+code);//打印日志
HttpSession session = request.getSession(); //设置session
session.setAttribute("code", code);  //将短信验证码放到session中保存
session.setMaxInactiveInterval(60* 5);//保存时间 暂时设定为5分钟
returnnew Response(Status.SUCCESS, message);
}else{
message = "短信发送失败";
returnnew Response(Status.ERROR, message);
}
}
}

这样就能发送成功了。

测试:

利用POSTMAN在本地进行测试:

结果:

到此发送成功。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

原文链接:http://www.cnblogs.com/xkyzp/p/6203845.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 当学生压力大怎么办 高三学习不好怎么办 高考孩子焦虑症怎么办 孩子高三厌学怎么办 高三厌学家长怎么办 高中生学习压力大怎么办 孩子反应有点慢怎么办 小学计算总出错怎么办 孩子粗心丢分怎么办 总是粗心丢分怎么办 卷子落在教室了怎么办 孩子总是丢题怎么办 孩子老师落题怎么办 孩子做题不认真马虎怎么办 工作犯了大错怎么办 工作上总是出错怎么办 工作中总是出错怎么办 晚上睡觉容易惊醒怎么办 每天早上被吵醒怎么办 孩子好动不爱学习怎么办 自习课不写作业怎么办 不爱学习的小孩怎么办 一年级小孩不爱学习怎么办 小孩不听话不爱学习怎么办 父母犯错我们该怎么办 孩子学习不爱动脑筋怎么办 孩子考试太马虎怎么办 小孩做作业马虎怎么办 同学抄我作业怎么办 别人抄我答案怎么办 学生考试前紧张怎么办 科目一考试紧张怎么办 1年级不认真学习怎么办 学生考试时紧张怎么办 小朋友不写作业怎么办 面对作业多应该怎么办 小学学生作业多怎么办 二年级学生马虎怎么办 孩子做数学题粗心怎么办 小孩拉的屎很粗怎么办 生地会考没及格怎么办