近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家见谅!
一:首先上几张案例截图,以便大家可以了解一下短信验证码的流程,这里我在做的过程中也参考了很多网站的短信验证码,比如:58同城,汽车之家等。
1.点击获取验证码之前的样式:
2.输入正确的手机号后点击获取验证码之后的样式:
3.如果手机号已经被注册的样式:
4.如果一个手机号一天发送超过3次就提示不能发送:
二:前台的注册页面的代码:reg.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%@page import="cn.gov.csrc.base.action.FindAllData"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
中国证券会证券期货违法违规举报中心-注册
<%@include file="/statics/top.jspf"%>
<%@include file="/common/buttom.jspf"%>
var InterValObj; //timer变量,控制时间
var count = 120; //间隔函数,1秒执行
var curCount;//当前剩余秒数
var code = ""; //验证码
var codeLength = 6;//验证码长度
function sendMessage() {
curCount = count;
var jbPhone = $("#jbPhone").val();
var jbPhoneTip = $("#jbPhoneTip").text();
if (jbPhone != "") {
if(jbPhoneTip == "√ 该手机号码可以注册,输入正确" || jbPhoneTip == "√ 短信验证码已发到您的手机,请查收"){
// 产生验证码
for ( var i = 0; i < codeLength; i++) {
code += parseInt(Math.random() * 9).toString();
}
// 设置button效果,开始计时
$("#btnSendCode").attr("disabled", "true");
$("#btnSendCode").val("请在" + curCount + "秒内输入验证码");
InterValObj = window.setInterval(SetRemainTime, 1000); // 启动计时器,1秒执行一次
// 向后台发送处理数据
$.ajax({
type: "POST", // 用POST方式传输
dataType: "text", // 数据格式:JSON
url: "UserAction_sms.action", // 目标地址
data: "jbPhone=" + jbPhone +"&code=" + code,
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
success: function (data){
data = parseInt(data, 10);
if(data == 1){
$("#jbPhoneTip").html("√ 短信验证码已发到您的手机,请查收");
}else if(data == 0){
$("#jbPhoneTip").html("× 短信验证码发送失败,请重新发送");
}else if(data == 2){
$("#jbPhoneTip").html("× 该手机号码今天发送验证码过多");
}
}
});
}
}else{
$("#jbPhoneTip").html("× 手机号码不能为空");
}
}
//timer处理函数
function SetRemainTime() {
if (curCount == 0) {
window.clearInterval(InterValObj);// 停止计时器
$("#btnSendCode").removeAttr("disabled");// 启用按钮
$("#btnSendCode").val("重新发送验证码");
code = ""; // 清除验证码。如果不清除,过时间后,输入收到的验证码依然有效
}else {
curCount--;
$("#btnSendCode").val("请在" + curCount + "秒内输入验证码");
}
}
$(document).ready(function() {
$("#SmsCheckCode").blur(function() {
var SmsCheckCodeVal = $("#SmsCheckCode").val();
// 向后台发送处理数据
$.ajax({
url : "UserAction_checkCode.action",
data : {SmsCheckCode : SmsCheckCodeVal},
type : "POST",
dataType : "text",
success : function(data) {
data = parseInt(data, 10);
if (data == 1) {
$("#SmsCheckCodeTip").html("√ 短信验证码正确,请继续");
} else {
$("#SmsCheckCodeTip").html("× 短信验证码有误,请核实后重新填写");
}
}
});
});
});
四:验证码用户名和手机号码的js:register.js
//去掉前后空格
function trim(str) {
var strnew = str.replace(/^\s*|\s*$/g, "");
return strnew;
}
//用户名
function checkusername() {
var username = document.form1.username.value;
if (username == "" || !isNaN(username.charAt(0))) {
document.getElementById("usernameTip").innerHTML = "× 首字母不能为数字或者用户名不能为空";
return false;
} else if (username.length < 6 || username.length > 30) {
document.getElementById("usernameTip").innerHTML = "× 用户名长度为6-30位字符";
return false;
} else {
document.getElementById("usernameTip").innerHTML = "√ 用户名合格";
// 向后台发送处理数据
$.ajax({
url : "UserAction_checkUserName.action",// 目标地址
data : {username : username}, // 目标参数
type : "POST", // 用POST方式传输
dataType : "text", // 数据格式:text
success : function(data) {
data = parseInt(data, 10);
if (data != 0) {
$("#usernameTip").html("× 该用户名已经被注册,请重新输入");
} else {
$("#usernameTip").html("√ 该用户名可以注册,输入正确");
}
}
});
return true;
}
}
// 登录密码
function checkpassword() {
var password = document.form1.password.value;
if (password.length < 6 || password.length > 30) {
document.getElementById("passwordTip").innerHTML = "× 密码长度不能小于6位,大于30位";
return false;
} else if (!isNaN(password)) {
document.getElementById("passwordTip").innerHTML = "× 密码不能全是数字";
return false;
} else {
document.getElementById("passwordTip").innerHTML = "√ 密码合格";
return true;
}
}
// 确认密码
function checkpasswrodb() {
var password = document.form1.password.value;
var passwordRepeat = document.form1.passwordRepeat.value;
if (trim(password) != trim(passwordRepeat)) {
document.getElementById("passwordRepeatTip").innerHTML = "× 两次密码输入必须一致";
return false;
} else {
document.getElementById("passwordRepeatTip").innerHTML = "√ 密码输入一致";
return true;
}
}
// 姓名
function checknickname() {
var nickname = document.form1.nickname.value;
if (trim(nickname) == "") {
document.getElementById("nicknameTip").innerHTML = "× 姓名不能为空";
return false;
} else {
document.getElementById("nicknameTip").innerHTML = "√ 姓名输入正确";
return true;
}
}
// 联系手机(ajax验证手机号码是否已经存在)
function checkjbPhone() {
var jbPhone = document.form1.jbPhone.value;
var re= /(^1[3|5|8][0-9]{9}$)/;
if (trim(jbPhone) == "") {
document.getElementById("jbPhoneTip").innerHTML = "× 手机号码不能为空";
return false;
} else if(trim(jbPhone) != ""){
if(!re.test(jbPhone)){
document.getElementById("jbPhoneTip").innerHTML = "× 请输入有效的手机号码";
return false;
}else{
document.getElementById("jbPhoneTip").innerHTML = "√ 手机号码输入正确";
// 向后台发送处理数据
$.ajax({
url : "UserAction_checkPhone.action",// 目标地址
data : {jbPhone : jbPhone}, // 目标参数
type : "POST", // 用POST方式传输
dataType : "text", // 数据格式:text
success : function(data) {
data = parseInt(data, 10);
if (data != 0) {
$("#jbPhoneTip").html("× 该手机号码已经被注册,请重新输入");
} else {
$("#jbPhoneTip").html("√ 该手机号码可以注册,输入正确");
}
}
});
return true;
}
}
}
// 证件号码
function checkjbCredentialsCode() {
var jbCredentialsCode = document.form1.jbCredentialsCode.value;
var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
if (trim(jbCredentialsCode) == "") {
document.getElementById("jbCredentialsCodeTip").innerHTML = "× 证件号码不能为空";
return false;
} else if(trim(jbCredentialsCode) != ""){
if(!reg.test(jbCredentialsCode)){
document.getElementById("jbCredentialsCodeTip").innerHTML = "× 请输入合法的证件号码";
return false;
}else{
document.getElementById("jbCredentialsCodeTip").innerHTML = "√ 证件号码输入正确";
// 向后台发送处理数据
$.ajax({
url : "UserAction_checkCredentialsCode.action",// 目标地址
data : {jbCredentialsCode : jbCredentialsCode}, // 目标参数
type : "POST", // 用POST方式传输
dataType : "text", // 数据格式:text
success : function(data) {
data = parseInt(data, 10);
if (data != 0) {
$("#jbCredentialsCodeTip").html("× 该证件号码已经被注册,请重新输入");
} else {
$("#jbCredentialsCodeTip").html("√ 该证件号码可以注册,输入正确");
}
}
});
return true;
}
}
}
// 所在地区
function checkjbSourceArea() {
var jbSourceArea = document.form1.jbSourceArea.value;
if (trim(jbSourceArea) == "") {
document.getElementById("jbSourceAreaTip").innerHTML = "× 请选择所在地区";
return false;
} else {
document.getElementById("jbSourceAreaTip").innerHTML = "√ 所在地区选择正确";
return true;
}
}
// 验证码
function checkNumber() {
var checkNum = document.form1.checkNum.value;
if (trim(checkNum) == "") {
document.getElementById("checkNumTip").innerHTML = "× 验证码不能为空";
return false;
} else {
document.getElementById("checkNumTip").innerHTML = "√ 验证码合格";
// 向后台发送处理数据
$.ajax({
url : "UserAction_checkNum.action",// 目标地址
data : {checkNum : checkNum}, // 目标参数
type : "POST", // 用POST方式传输
dataType : "text", // 数据格式:text
success : function(data) {
data = parseInt(data, 10);
if (data != 0) {
$("#checkNumTip").html("× 验证码错误");
} else {
$("#checkNumTip").html("√ 验证码正确");
}
}
});
return true;
}
}
五:后台action的代码:UserAction.java(这里只是调用了我们的第三方给提供的客户端代码的发送短信的方法,如果是调用其他的短信平台,可以换成他们的发送短信的方法,这里只是给大家做个参考)
package cn.gov.csrc.base.systemmanager.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import cn.gov.csrc.base.action.BaseAction;
import cn.gov.csrc.base.log.service.LogService;
import cn.gov.csrc.base.report.util.CommonUtil;
import cn.gov.csrc.base.report.util.Env;
import cn.gov.csrc.base.systemmanager.model.Count;
import cn.gov.csrc.base.systemmanager.model.User;
import cn.gov.csrc.base.systemmanager.service.CountService;
import cn.gov.csrc.base.systemmanager.service.UserService;
import cn.gov.csrc.base.util.WebContextUtil;
import com.sms.webservice.client.SmsReturnObj;
import com.sms.webservice.client.SmsWebClient;
/**
* File: UserAction.java
* Author: jiangsai
* Version: 1.1
* Date: 04/17/2013
* Modify:
* Description:用户
* Copyright csrc
*/
@Controller()
@Scope("prototype")
@Results({
@Result(name = "success", location = "/statics/report.jsp"),
@Result(name = "modifyPassword", location = "/statics/modifyPassword.jsp")
})
public class UserAction extends BaseAction {
private static final long serialVersionUID = 1214696686677691191L;
private static Logger log = Logger.getLogger(UserAction.class);
private static final String url = Env.getInstance().getProperty("url");
private static final String userName = Env.getInstance().getProperty(
"username");
private static final String passWord = Env.getInstance().getProperty(
"password");
private Integer id;
private String username;// 用户名
private String password;// 密码
private String passwordRepeat;// 确认密码
private String jbPhone;//手机号码
private String jbCredentialsCode;//身份证号码
private String checkNum;//图片验证码
private String newPassword;
private String confirmPassword;
private Integer[] ownRoleIds;
private UserService userService;
private CountService countService;
private LogService logService;
private Count count = new Count();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPasswordRepeat() {
return passwordRepeat;
}
public void setPasswordRepeat(String passwordRepeat) {
this.passwordRepeat = passwordRepeat;
}
public String getJbPhone() {
return jbPhone;
}
public void setJbPhone(String jbPhone) {
this.jbPhone = jbPhone;
}
public String getJbCredentialsCode() {
return jbCredentialsCode;
}
public void setJbCredentialsCode(String jbCredentialsCode) {
this.jbCredentialsCode = jbCredentialsCode;
}
public String getCheckNum() {
return checkNum;
}
public void setCheckNum(String checkNum) {
this.checkNum = checkNum;
}
public Integer[] getOwnRoleIds() {
return ownRoleIds;
}
public void setOwnRoleIds(Integer[] ownRoleIds) {
this.ownRoleIds = ownRoleIds;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
public String getConfirmPassword() {
return confirmPassword;
}
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}
@Resource
public void setUserService(UserService userService) {
this.userService = userService;
}
public UserService getUserService() {
return userService;
}
@Resource
public void setCountService(CountService countService) {
this.countService = countService;
}
public CountService getCountService() {
return countService;
}
public LogService getLogService() {
return logService;
}
@Resource
public void setLogService(LogService logService) {
this.logService = logService;
}
public Count getCount() {
return count;
}
public void setCount(Count count) {
this.count = count;
}
public void prepareToUpdatePage() {
model = userService.getEntity(id);
}
/**
* 用户登录
*
* @return success
*/
@Action(value = "UserAction_login")
public String login() {
Object u = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (u instanceof User && u != null) {
WebContextUtil.getSession().setAttribute("user", u);
User user = (User)u;
//使用数据库表TBL_BASE_LOG添加用户登录的日志信息
logService.saveTblBaseLog(WebContextUtil.getRequest(),"当前操作人【"+user.getNickname()+"】登录系统");
} else {
// 防止绕过登陆页面直接执行Action
return "login";
}
return SUCCESS;
}
/**
* 用户密码更新
*/
@Action(value = "UserAction_updateUser")
public String updateUser() {
if (!newPassword.equals(confirmPassword)) {
this.setMessage("新密码与确认密码不一致!");
return "modifyPassword";
}
User u = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder("md5");
String psw = encoder.encodePassword(newPassword, null);
userService.modifyPassword(u, psw);
this.setMessage("保存成功!");
return "modifyPassword";
}
/**
* 验证用户名是否存在
*
* @throws Exception
*/
@Action(value = "UserAction_checkUserName")
public void checkUserName(){
String result = "0";
try {
List list = userService.findUserByUserName(username);
if(list != null && list.size() > 0){
result = "1";
}else{
result = "0";
}
HttpServletResponse response = WebContextUtil.getResponse();
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.write(result.toString());
} catch (IOException e) {
throw new RuntimeException("验证身份证号码出错", e);
}
}
/**
* 验证原始密码是否正确
*
* @throws Exception
*/
@Action(value = "UserAction_checkPassWord")
public void checkPassWord() throws Exception {
String result = "0";
MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder("md5");
String pwd = encoder.encodePassword(password, null);
List user = userService.findUserByPassWord(pwd);
if (user != null && user.size() > 0) {
result = "1";
}else{
result = "0";
}
HttpServletResponse response = WebContextUtil.getResponse();
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.write(result.toString());
}
/**
* 验证手机号码是否存在
*/
@Action(value = "UserAction_checkPhone")
public void checkPhone(){
String result = "0";
try {
List list = userService.findUserByPhone(jbPhone);
if(list != null && list.size() > 0){
result = "1";
}else{
result = "0";
}
HttpServletResponse response = WebContextUtil.getResponse();
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.write(result.toString());
} catch (IOException e) {
throw new RuntimeException("验证手机号码出错", e);
}
}
/**
* 验证身份证号码是否存在
*/
@Action(value = "UserAction_checkCredentialsCode")
public void checkCredentialsCode(){
String result = "0";
try {
List list = userService.findUserByCredentialsCode(jbCredentialsCode);
if(list != null && list.size() > 0){
result = "1";
}else{
result = "0";
}
HttpServletResponse response = WebContextUtil.getResponse();
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.write(result.toString());
} catch (IOException e) {
throw new RuntimeException("验证身份证号码出错", e);
}
}
/**
* 验证验证码是否正确
*/
@Action(value = "UserAction_checkNum")
public void checkNum(){
try {
String result = "0";
String check_number_key = (String)WebContextUtil.getSession().getAttribute("CHECK_NUMBER_KEY");
if(checkNum != check_number_key && !checkNum.equals(check_number_key)){
result = "1";
}else{
result = "0";
}
HttpServletResponse response = WebContextUtil.getResponse();
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.write(result.toString());
} catch (IOException e) {
throw new RuntimeException("验证验证码出错", e);
}
}
/**
* 验证短信验证码是否正确
*
* @throws Exception
*/
@Action(value = "UserAction_checkCode")
public void checkCode() throws Exception{
String result = "0";
/** 获取手动输入的手机短信验证码 */
String SmsCheckCode = WebContextUtil.getRequest().getParameter("SmsCheckCode");
/** 获取session中存放的手机短信验证码 */
String code = (String) WebContextUtil.getSession().getAttribute("code");
try {
if(SmsCheckCode != code && !SmsCheckCode.equals(code)){
result = "0";
}else{
result = "1";
}
} catch (Exception e) {
throw new RuntimeException("短信验证失败", e);
}
HttpServletResponse response = WebContextUtil.getResponse();
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.write(result.toString());
}
/**
* 验证手机短信是否发送成功
*
* @throws Exception
*/
@Action(value = "UserAction_sms")
public void sms() throws Exception {
String result = "0";
/** 手机号码 */
String jbPhone = WebContextUtil.getRequest().getParameter("jbPhone");
/** 短信验证码 */
String code = WebContextUtil.getRequest().getParameter("code");
/** 短信验证码存入session(session的默认失效时间30分钟) */
WebContextUtil.getSession().setAttribute("code", code);
/** 如何初始化失败返回 */
if(!initClient()) {
return;
}
/** 单个手机号发送短信的方法的参数准备 */
// 手机号码
String mobilephone = jbPhone;
// 短信内容+随机生成的6位短信验证码
String content = "根据中国证监会举报中心委托,特向您发送此条短信。您的注册验证码为:" + code;
// 操作用户的ID
Integer operId = Integer.parseInt(Env.getInstance().getProperty("operId"));
// 定时发送的的发送时间(缺省为空,如果即时发送,填空)
String tosend_time = "";
// 应用系统的短信ID,用户查询该短信的状态报告(缺省为0,即不需查询短信的状态报告)
int sms_id = 0;
// 黑名单过滤(0:不需要黑名单过滤,1:需要黑名单过滤,缺省为0)
short backlist_filter = 0;
// 禁止语过滤(0:不需要禁止语过滤,1:需要禁止语过滤,缺省为0)
short fbdword_filter = 0;
// 优先级(值越大优先级越高,0:普通,1,:优先,2:最高,缺省为0)
short priority = 0;
// 短信有效时间(格式为:YYYY-MM-DD HH:mm:ss目前为空)
String valid_time = "";
/** 发送短信之前先统计一个已经发送的短信条数 */
int messageCount = countService.findAllRecord(mobilephone);
log.info("已发短信条数为:" +messageCount);
if(messageCount < 5){
/** 单个手机号发送短信 */
if (!sendMessage(mobilephone, content, operId, tosend_time, sms_id,
backlist_filter, fbdword_filter, priority, valid_time)) {
result = "0";// 失败
} else {
result = "1";// 成功
/** 发送一条短信,记录一条短信记录,为了方便之后的统计短信发送次数 */
count.setPhone(mobilephone);// 手机号码
count.setCaptcha(code);// 短信验证码
count.setSendTime(CommonUtil.getNowDate());// 短信发送时间
if(count != null){
countService.saveEntity(count);
log.info("短信验证码发送记录保存成功!");
}
}
}else{
result = "2";//一个手机号码最多发送5条短信验证码
log.info("该手机号码今天发送验证码过多");
}
HttpServletResponse response = WebContextUtil.getResponse();
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.write(result.toString());
}
/**
* WebService客户端初始化
*
*/
public static boolean initClient() {
/**
* 判断客户端是否已经初始化
*/
if (!SmsWebClient.enable()) {
int ret = 0;
try {
ret = SmsWebClient.init(url, userName, passWord);
if (ret == -1 || !SmsWebClient.enable()) {
log.info("短信平台接口初始化失败!");
return false;
}
log.info("短信平台接口初始化成功!" + ret + "-----");
} catch (Exception ex) {
ex.printStackTrace();
log.info("短信平台接口初始化过程中异常!");
}
}
return true;
}
/**
* 单个手机号码发送
*
* @param mobilephone
* 手机号
* @param content
* 短信内容
* @param operId
* 操作用户的ID
* @param tosend_time
* 定时发送的发送时间
* @param sms_id
* 应用系统的短信ID
* @param backlist_filter
* 黑名单过滤
* @param fbdword_filter
* 禁止语过滤
* @param priority
* 优先级
* @param valid_time
* 短信有效时间
*/
public static boolean sendMessage(java.lang.String mobilephone,
java.lang.String content, int operId, java.lang.String tosend_time,
int sms_id, short backlist_filter, short fbdword_filter,
short priority, java.lang.String valid_time) {
// 单个手机号码发送
try {
SmsReturnObj retObj = SmsWebClient.webSendMessage(mobilephone,
content, operId, tosend_time, sms_id, backlist_filter,
fbdword_filter, priority, valid_time);
if (retObj.getReturnCode() != 1) {
log.info("短信发送失败,原因为:" + retObj.getReturnMsg());
return false;
} else {
log.info("短信发送成功!返回结果为:" + retObj.getReturnMsg());
return true;
}
} catch (Exception ex) {
ex.printStackTrace();
log.info("短信发送过程发生异常!");
}
return true;
}
}
六:具体的短信接口demo到这里下,这里你下载了也不能成功的发送短信,因为你必须要短信平台商给你提供:url,userName,passWord,operId,以及短信平台商还要绑定你的外网ip地址,这样才能真正的发送短信。
Demo下载链接:http://pan.baidu.com/s/1qWt1Qdm
原文:http://www.zuidaima.com/share/1881657001233408.htm