业务需求:
点击获取验证码之后出现60倒计时效果,且获取验证码按钮不可点击,同时手机会收到短信验证码,若收不到可60秒之后重复获取。
主要代码:
1、页面
<s:form id="getApplyCodeForm" method="post"> <table width="92%" border="0" align="center" cellpadding="10" cellspacing="0"> <tr> <td class="reg_left">手机号码:</td> <td width="160"><input id="tryUserAimCode" name="tryUserAimCode" class="easyui-validatebox" required="true" validtype="mobile" missingMessage="手机号码不能为空" /> <input type="hidden" name="smsCount" id="smsCount" value="1"/> </td> <td class="reg_xxts"><a href="#" class="easyui-linkbutton" id="getTryCodeButton" onclick="getRegCode()">获取验证码</a> </td> </tr> <tr> <td> </td> <td colspan="2"> <div class="xsnazzy" id="timeInfo" style="display: none;"> <b class="xb1"></b><b class="xb2"></b><b class="xb3"></b><b class="xb4"></b><b class="xb5"></b><b class="xb6"></b><b class="xb7"></b> <div class="xboxcontent"> <label for="male" id="infoValue"></label> </div> <b class="xb7"></b><b class="xb6"></b><b class="xb5"></b><b class="xb4"></b><b class="xb3"></b><b class="xb2"></b><b class="xb1"></b> </div></td> </tr> </table> </s:form>
2、js倒计时代码:
function begintimer(){
if (!document.images)
return
if (parselimit==1)
//下面是限制时间到了后去的连接页面,自己修改。
changeButtonStates(0);
else{
parselimit-=1;
curmin=Math.floor(parselimit/60);
cursec=Math.floor(parselimit%60);
if (curmin!=0){
curtime=curmin+"分"+cursec+"秒后才能重新获取验证码"
}else{
curtime=cursec+"秒后才能重新获取验证码"
}
setTimeout("begintimer()",1000);
document.getElementById('infoValue').innerText=curtime;
//下一句告诉访问者剩余的时间,在状态栏中显示。
window.status=curtime;
}
}
//切换状态控制获取验证码链接失效与启用
function changeButtonStates(state) {
if (state == 0) {
$('#getTryCodeButton').linkbutton('enable');
$('#timeInfo').css({display:"none"});
} else {
$('#getTryCodeButton').linkbutton('disable');
$('#timeInfo').css({display:"block"});
}
}
3、js获取验证码:
function getRegCode() {
$.ajax({
url : "${path}/account/checkMob",
type : "POST",
data : "account.ACCMOB=" + $('#phoneRe').val(),
contentType : "application/x-www-form-urlencoded;charset=utf-8",
async : false,
success : function(data) {
res = data;
if (data == 1) {
document.getElementById('phoneReInfo').innerHTML = '<font color="red">该手机号已被注册</font>';
refreshYzm();
} else {
//document.getElementById('phoneReInfo').innerHTML = '<font color="green">该手机号可用</font>';
changeButtonStates(1);
$
.ajax({
url : "${path}/account/reAimcodeGetVeCode",
type : "POST",
data : "account.ACCMOB="
+ $('#phoneRe').val()
+ "&fromSource=4&smsCount="+$('#smsCount').val()
+"&searchName="+$.trim($('#inputCaptcha').val()),
contentType : "application/x-www-form-urlencoded;charset=utf-8",
async : false,
success : function(data) {
myArray = data.split("&");
if (myArray[0] == '发送成功!') {
canCaptcha = true;
//document.getElementById('phoneReInfo').innerHTML = '<font color="green">验证码已发送,请注意查收!</font>';
alert("验证码已经发送到您的手机,请查收!");
begintimer();
accountFID = myArray[1];
}else if(data == '限制申请'){
document.getElementById('phoneReInfo').innerHTML = '<font color="red">一个手机号码一天最多只能申请3次!</font>';
changeButtonStates(0);
refreshYzm();
}else if(data == '验证码错误'){
document.getElementById('phoneReInfo').innerHTML = '<font color="red">验证码错误!</font>';
changeButtonStates(0);
refreshYzm();
}else{
alert(data);
changeButtonStates(0);
refreshYzm();
}
},
error : function() {
alert('异常,内部验证出错!'+data);
}
});
}
},
error : function() {
alert('异常,验证出错!');
}
});
}
var smsCount=parseInt($('#smsCount').val());
smsCount=smsCount<3?smsCount+1:3;
$('#smsCount').val(smsCount);
}
4、后台获取验证码代码:
// 注册新用户
@Action(value = "reAimcodeGetVeCode")
public void reAimcodeGetVeCode() {
PrintWriter out;
String result = "验证码申请失败!请重试!";
try {
smsUnit = new SmsUnit(ConfUtil.getProperty("sys_sms_server"));
if (null != account.getACCMOB() && !account.getACCMOB().equals("")) {
account.setACCSTATUS(new BigDecimal(1));//设置使用状态未用
String verifyCode = String
.valueOf(new Random().nextInt(899999) + 100000);//生成短信验证码
account.setFSECURITYCODE(verifyCode);
account.setACCCREATEDATE(new Date());
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, 1); // 设置验证码失效时间为24小时
account.setFREGISTERSOURCE(fromSource);
// 判断该手机是否获取过验证码
AccountCriteria accountCriteria = new AccountCriteria();
accountCriteria.createCriteria().andACCMOBEqualTo(
account.getACCMOB());
List<Account> accs = accountService
.selectByExample(accountCriteria);
int re = 0;
Integer cishu = 0;
if (accs == null || accs.isEmpty()) {
cishu = 1;
account.setSDKURL("1");
account.setFSECURITYOUTTIME(c.getTime());
BigDecimal accid=accountService.getPrimaryKey();
account.setFID(accid);
re = accountService.insertSelective(account,IPUtil.getRealIP(request));
Cookie cookie=new Cookie("id" , accid.toString());
cookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(cookie);
} else {
Account ac = accs.get(0);
account.setFID(ac.getFID());
Date date = new Date();
// 如果是新的一天则使用次数修改为1
if (date.getDate() == ac.getFSECURITYOUTTIME().getDate()) {
account.setSDKURL("1");
} else {
Integer count = Integer.parseInt(ac.getSDKURL());
account.setSDKURL(count + 1 + "");
}
cishu = Integer.parseInt(account.getSDKURL());
account.setFSECURITYOUTTIME(c.getTime());
if (cishu <= 3)
re = accountService
.updateByPrimaryKeySelective(account);
}
if (re > 0 && cishu <= 3) {
request.getSession().removeAttribute(ConstValues.WEB_SESSION_PROMOTE);
AccountCriteria ac = new AccountCriteria();
ac.createCriteria().andACCMOBEqualTo(account.getACCMOB());
List<Account> acList = new ArrayList<Account>();
acList = accountService.selectByExample(ac);
if (acList != null && acList.size() > 0) {
// 这里执行短信发送
String content = "您的验证码为:" + verifyCode+",该码有效期为24小时,该码只能使用一次!【短信签名】";
SendSmsReply sendSmsReply = smsUnit.sendSms(accName,accPwd ,account.getACCMOB(),content,"");
//调用第三方接口发送短信 result = sendSmsReply.getReplyMsg() + "&"
+ acList.get(0).getFID() + "&"
+ acList.get(0).getSDKURL();
}
} else if (cishu > 3) {
result = "限制申请";
}
}
} catch (Exception e) {
logger.error("获取验证码失败", e);
} finally {
try {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
out = response.getWriter();
out.write(result);
} catch (IOException e) {
logger.error("", e);
}
}
}
//这里调用的动力思维乐信(www.lx598.com)第三方短信验证码接口,短信验证码接口接入参考文档说明地址:http://www.lx598.com/apitext.html ,
//java demo示例:http://www.lx598.com/javaCode.html 。
//调用第三方接口发送短信通知 SendSmsReply
/**
* 发送短信
* @param accName 第三方短信平台登陆用户名
* @param accPwd 第三方短信平台登陆密码
* @param seed 当前时间 格式:YYYYMMDD HHMISS 例如:20130806102030
* @param aimcodes 获取验证码的手机号
* @param content 内容后加签名
* @param schTime 定时时间格式如:2010-01-01 08:00:00
* @return 服务端返回的结果 ok:业务id 或者 错误代码
*/
public static String sendSms(String accName,String accPwd,String mobie,String content,String schTime){
StringBuffer sb = new StringBuffer("http://sdk.lx198.com/sdk/send2?");
try {
String seed=new SimpleDateFormat(dateFormatStr).format(new Date());
sb.append("&accName="+accName);
sb.append("&seed="+seed);
sb.append("&accPwd="+MD5.getMd5String(MD5.getMd5String(accPwd)+seed));
sb.append("&aimcode="+mobie);
sb.append("&schTime="+URLEncoder.encode(schTime,"UTF-8")); //空格标点符号做encode转换
sb.append("&content="+URLEncoder.encode(content,"UTF-8")); //中文做encode转换
URL url = new URL(sb.toString());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
return in.readLine();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
浙公网安备 33010602011771号