java短信验证码获取次数限制实例
现在不管什么项目,用到短信验证功能,都会在程序上设计一个短信验证码的获取次数限制,这样主要是避免短信验证码接口被刷。
前一段正好做一个项目的用户短信验证码登录功能,就研究了以下,下面贴出来分享一下。
这里涉及到的短信接口,用的第三方短信接口—动力思维思维乐信的(http://www.lx598.com/),如果想了解短信接口接入,可以到他们官网,查看下短信接口API文档说明,参考下面的代码应该就能弄明白。
用户注册部分,主要代码如下:
//主要js方法:
//获取手机验证码:
functiongetRegCode(){
if($.trim($('#inputCaptcha').val())==''){
$('#imgRs').html("图形验证码不能为空");
$('#inputCaptcha').select();
return;
}
if(!isPhoneNum($('#phoneRe').val())){
document.getElementById('phoneReInfo').innerHTML='请填写有效的11位手机号码';
}else{
document.getElementById('phoneReInfo').innerHTML='注册后用手机号码进行登录';
$.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='该手机号已被注册';
refreshYzm();
}else{
document.getElementById('phoneReInfo').innerHTML='该手机号可用';
$.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='验证码已发送,请注意查收!
accountFID=myArray[1];
}elseif(data=='限制申请'){
document.getElementById('phoneReInfo').innerHTML='一个手机号码一天最多只能申请3次!';
refreshYzm();
}elseif(data=='验证码错误'){
document.getElementById('phoneReInfo').innerHTML='验证码错误!';
refreshYzm();
}
},
error:function(){
alert('异常,内部验证出错!'+data);
}
});
}
},
error:function(){
alert('异常,验证出错!');
}
});
}
varsmsCount=parseInt($('#smsCount').val());
smsCount=smsCount<3?smsCount+1:3;
$('#smsCount').val(smsCount);
}
//注册新用户
//account为用户类
@Action(value="reAimcodeGetVeCode")
publicvoidreAimcodeGetVeCode(){
PrintWriterout;
Stringresult="验证码申请失败!请重试!";
try{
smsUnit=newSmsUnit(ConfUtil.getProperty("sys_sms_server"));
if(null!=account.getACCMOB()&&!account.getACCMOB().equals("")){
account.setACCSTATUS(newBigDecimal(1));//设置使用状态:未用
StringverifyCode=String
.valueOf(newRandom().nextInt(899999)+100000);//生成短信验证码
account.setFSECURITYCODE(verifyCode);
account.setACCCREATEDATE(newDate());
Calendarc=Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH,1);//设置验证码失效时间为24小时
account.setFREGISTERSOURCE(fromSource);//设置注册来源
//判断该手机是否获取过验证码
AccountCriteriaaccountCriteria=newAccountCriteria();
accountCriteria.createCriteria().andACCMOBEqualTo(
account.getACCMOB());
Listaccs=accountService
.selectByExample(accountCriteria);
//验证码申请次数
intre=0;
Integercishu=0;
//如果用户不存在
if(accs==null||accs.isEmpty()){
cishu=1;
account.setSDKURL("1");
account.setFSECURITYOUTTIME(c.getTime());//设置验证码有效时间
BigDecimalaccid=accountService.getPrimaryKey();
account.setFID(accid);
re=accountService.insertSelective(account,IPUtil.getRealIP(request));
Cookiecookie=newCookie("id",accid.toString());
cookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(cookie);
}else{
Accountac=accs.get(0);
account.setFID(ac.getFID());
Datedate=newDate();
//通过时间判定申请验证码次数
//如果是新的一天,则使用次数改为1
if(date.getDate()>=ac.getFSECURITYOUTTIME().getDate()){
account.setSDKURL("1");
}else{
Integercount=Integer.parseInt(ac.getSDKURL());
account.setSDKURL(count+1+"");//不是新的一天则次数+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);
AccountCriteriaac=newAccountCriteria();
ac.createCriteria().andACCMOBEqualTo(account.getACCMOB());
ListacList=newArrayList();
acList=accountService.selectByExample(ac);
if(acList!=null&&acList.size()>0){
//这里执行短信发送
Stringcontent="您的验证码为:"+verifyCode+",该码有效期为24小时,该码只能使用一次!【短信签名】";
SendSmsReplysendSmsReply=smsUnit.sendSms(accName,accPwd,account.getACCMOB(),content,"");
//调用第三方接口发送短信result=sendSmsReply.getReplyMsg()+"&"
+acList.get(0).getFID()+"&"
+acList.get(0).getSDKURL();
}
}elseif(cishu>3){
result="限制申请";
}
}
}catch(Exceptione){
logger.error("获取验证码失败",e);
}finally{
try{
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
out=response.getWriter();
out.write(result);
}catch(IOExceptione){
logger.error("",e);
}
}
}
//这是动力思维乐信第三方短信接口的发送短信功能部分参考代码:
/**
*发送短信
*@paramaccName乐信账号用户名
*@paramaccPwd乐信账号密码
*@paramseed当前时间格式:YYYYMMDDHHMISS例如:20130806102030
*@paramaimcodes手机号多个手机号之间英文半角逗号隔开
*@paramcontent内容后加签名
*@paramschTime定时时间格式如:2010-01-0108:00:00
*@return服务端返回的结果ok:业务id或者错误代码
*/
publicstaticStringsendSms(StringaccName,StringaccPwd,Stringmobies,Stringcontent,StringschTime){
StringBuffersb=newStringBuffer("http://sdk.lx198.com/sdk/send2?");
try{
Stringseed=newSimpleDateFormat(dateFormatStr).format(newDate());
sb.append("&accName="+accName);
sb.append("&seed="+seed);
sb.append("&accPwd="+MD5.getMd5String(MD5.getMd5String(accPwd)+seed));
sb.append("&aimcodes="+mobies);
sb.append("&schTime="+URLEncoder.encode(schTime,"UTF-8"));//空格标点符号做encode转换
sb.append("&content="+URLEncoder.encode(content,"UTF-8"));//中文做encode转换
URLurl=newURL(sb.toString());
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
BufferedReaderin=newBufferedReader(newInputStreamReader(url.openStream()));
returnin.readLine();
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。