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()); List acList=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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。