JAVA实现利用第三方平台发送短信验证码

前段时间自己做的一个小项目中,涉及到用短信验证码登录、注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来。

本文以注册为例,在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

import java.io.UnsupportedEncodingException;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
public class SendMsg_webchinese {
public static void main(String[] args)throws Exception
{
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("http://gbk.sms.webchinese.cn"); //该第三方短信服务地址
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
NameValuePair[] data ={ new NameValuePair("Uid", "本站用户名"),new NameValuePair("Key", "接口安全秘钥"),new NameValuePair("smsMob","手机号码"),new NameValuePair("smsText","验证码:8888")};
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println("statusCode:"+statusCode);
for(Header h : headers)
{
System.out.println(h.toString());
}
String result = new String(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集合。下面是以项目自己的需求对接口的更改:

import java.util.HashMap;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import com.yuetile.utils.VerifyingCodeGenerator;
public class SendMsg_webchineseController {
public static HashMap<String,String> getMessageStatus(String phone)throws Exception{
HashMap<String,String> m=new HashMap<String,String>();
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("http://gbk.sms.webchinese.cn");
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
String code=VerifyingCodeGenerator.generate();//验证码
NameValuePair[] data ={ new NameValuePair("Uid", "****"),new NameValuePair("Key", "******"),new NameValuePair("smsMob",phone),new NameValuePair("smsText","您正在注册本站会员,本次验证码为:"+code+""+"有效时间为5分钟")};
m.put("code", code);
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println("statusCode:"+statusCode);
for(Header h : headers)
{
System.out.println(h.toString());
}
String result = new String(post.getResponseBodyAsString().getBytes("gbk"));
System.out.println(result); //打印返回消息状态
m.put("result", result);
post.releaseConnection();
return m;
}
}

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

ACTION层:

/**
* @author hang
* @Decription 注册,发送短信验证码,保存到Session中
* @param 封装客户端请求 POST
* @return 返回状态参数
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = UrlDefine.Register.CHECKMESSAGEWORK, method = RequestMethod.POST)
public Object SendCheckMessage(HttpServletRequest request, @RequestBody UserBean u)
throws Exception {
String message = "发送成功";
String phone=u.getTelephone(); //获取到客户端发来的手机号
UserBean user = userService.getByPhone(phone);
if (user != null) {
message = "该手机号已被注册";
return new 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分钟
return new Response(Status.SUCCESS, message);
} else {
message = "短信发送失败";
return new Response(Status.ERROR, message);
}
}
}

这样就能发送成功了。

测试:

利用POSTMAN在本地进行测试:

JAVA实现利用第三方平台发送短信验证码

结果:

JAVA实现利用第三方平台发送短信验证码

到此发送成功。

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

时间: 2016-12-20

java生成图片验证码示例程序

复制代码 代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">&l

Java随机生成手机短信验证码的方法

本文实例讲述了Java随机生成手机短信验证码的方法.分享给大家供大家参考,具体如下: /** * 创建指定数量的随机字符串 * @param numberFlag 是否是数字 * @param length * @return */ public static String createRandom(boolean numberFlag, int length){ String retStr = ""; String strTable = numberFlag ? "1234

java实现验证码类生成中文验证码

复制代码 代码如下: package xwcms.net.service;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;im

Java实现验证码具体代码

这里实现我使用到了struts2模拟一个登录功能来验证java实现的验证码功能. Java实现验证码的步骤: 1.创建RandomImageGenerator.java类,该类实现验证码图片的生成 2.创建一个servlet类,RandomImageServlet.java,将生成的验证码输出到页面 3.创建一个Action类,LoginAction.java,控制登录 4.配置struts.xml一个web.xml文件 5.编写页面 具体实现用代码表达 1.创建RandomImageGener

Java Web开发之图形验证码的生成与使用方法

本文实例讲述了Java Web开发之图形验证码的生成与使用方法.分享给大家供大家参考.具体如下: 图形验证码的主要目的是为了增强的安全性,增加用户通过遍历所有可能性来破解密码的难度. 图形验证码的使用包括如下3部分: ① 图形验证码的生成: ② 在页面中的使用: ③ 验证: 1.图形验证码的生成 假设在Servlet生成图形验证码,在JavaBean或者JSP中生成的基本过程是相同的.设计如下过程: ① 设置响应的文档类型: ② 生成随机码: ③ 把随机码保存到session中: ④ 生成图片:

java登录验证码实现代码

VerifyCodeServlet.java类: 复制代码 代码如下: package com.spring.controller;import java.awt.Color;         import java.awt.Font;         import java.awt.Graphics2D;         import java.awt.image.BufferedImage;         import java.util.Random;         import ja

java 图片验证码的实现代码

复制代码 代码如下: makeCertPic.java package pic; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imagei

java实现网页验证码功能

本文实例为大家分享了java网页验证码的实现代码,供大家参考,具体内容如下 Servlet: package cn.bdqn.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.

Java实现仿淘宝滑动验证码研究代码详解

通过下面一张图看下要实现的功能,具体详情如下所示: 现在我就来介绍些软件的其它功能.希望大家有所受益. 模拟人为搜索商品 在刷单的时候,不能直接拿到一个商品网址就进入购买页面吧,得模拟人为搜索. 在这一个过程中有两个难点: 1)商品列表的异步加载 ; 2)翻页并且截图; 在园子里,我就不在关公面前耍大刀了. 直接上关键代码: i:搜索商品,并且翻页 public bool? SearchProduct(TaskDetailModel taskDetailData) { bool? result

Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例

代码如下所示: 复制代码 代码如下: package com.hoo.util; import java.awt.Color;  import java.awt.Font;  import java.awt.Graphics;  import java.awt.image.BufferedImage;  import java.util.Random; import javax.imageio.ImageIO;  import javax.servlet.http.HttpServletRequ

js随机生成26个大小写字母

首先为大家介绍js生成26个大小写字母,主要用到 str.charCodeAt()和 String.fromCharCode()方法 1.使用 charCodeAt()来获得字符串中某个具体字符的 Unicode 编码. 2.fromCharCode()可接受一个(或多个)指定的 Unicode 值,然后返回对应的字符串. //生成大写字母 A的Unicode值为65 function generateBig_1(){ var str = []; for(var i=65;i<91;i++){

Android随机生成验证码

Android随机生成验证码,Android利用随机数绘制不规则的验证码,加强用户登录或者注册的安全性. 具体思路如下: 在一块固定宽高的画布上,画上固定个数的随机数字和字母,再画上固定条数的干扰线 随机数和干扰线的颜色随机生成,随机数的样式随机生成. 界面效果如下: 1.生成随机数代码,Code.java: public class Code { //随机数数组 private static final char[] CHARS = { '2', '3', '4', '5', '6', '7'

支持中文字母数字、自定义字体php验证码代码

复制代码 代码如下: <?php /* * Captcha Class base on PHP GD Lib * @author Design * @version 1.0 * @demo * include('captchaClass.php'); * $captchaDemo=new Captcha(); * $captchaDemo->createImage(); */ class Captcha{ //@定义验证码图片高度 private $height; //@定义验证码图片宽度 p

PHP随机字符串生成代码(包括大小写字母)

第一种:利用字符串函数操作 复制代码 代码如下: <?php function createRandomStr($length){ $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符 $strlen = 62; while($length > $strlen){ $str .= $str; $strlen += 62; } $str = str_shuffle($str); return

PHP 动态随机生成验证码类代码

下面是效果图,这个效果图是没有开启干扰码的效果图 下面是类代码 复制代码 代码如下: <?php /************************************************ //FILE:ImageCode //DONE:生成动态验证码类 //DATE"2010-3-31 //Author:www.5dkx.com 5D开心博客 *********************************************************************

shell脚本实现随机生成10个8位密码

随机生成10个8位密码shell脚本 1.首位大写字母 2.中间六位大小写字母数字随机混合 3.第八位[0-9] #!/bin.bash for i in {1..10} do A=`head -c 500 /dev/urandom | tr -dc a-zA-Z | tr [a-z] [A-Z]|head -c 1` B=`head -c 500 /dev/urandom | tr -dc a-z0-9A-Z | head -c 6` C=`echo $RANDOM|cut -c 2` ech

Ajax 验证用户输入的验证码是否与随机生成的一致

后台Java代码[验证码生成] /** * 随机生成6位随机验证码 */ public static String createRandomVcode(){ //验证码 String vcode = ""; for (int i = 0; i < 6; i++) { vcode = vcode + (int)(Math.random() * 9); } return vcode; } 后台Java代码[使用验证码并将验证码保存到session里面] String authCode

java随机生成8位数授权码的实例

实例如下: package com.bwsk.modules.weixin.util; import java.util.Random; /** *随机生成8位数授权码 * */ public class RandomUtils { //生成8位数的 字母 大小随机 当做授权码 public static String randomUtil(){ Random r = new Random(); String code = ""; for (int i = 0; i < 8; +

ASP生成随机字符串(数字+大小写字母)的代码

<% 'ASP生成随机字符串(数字+大小写字母)练习 '阿会楠练习,为我所用,非我所想  Function randKey(obj)  Dim char_array(80)  Dim temp  For i = 0 To 9    char_array(i) = Cstr(i)  Next  For i = 10 To 35   char_array(i) = Chr(i + 55)  Next  For i = 36 To 61   char_array(i) = Chr(i + 61)  N