1. 程式人生 > >java限制簡訊驗證碼的次數(例項分享)

java限制簡訊驗證碼的次數(例項分享)

前兩天分享了怎麼用java去接入簡訊,今天正好做好新的功能,有的使用者收不到簡訊,就一直點重新發,其實可能是自己手機的問題,這個時候我們就需要限制使用者傳送簡訊了,當然這個功能也用於惡意被刷簡訊,惡意被刷簡訊會導致企業的簡訊消耗特別大,所以這個功能配合圖形驗證碼功能是非常有必要的。

這裡涉及到的簡訊介面,用的第三方簡訊介面—互億無線的(www.ihuyi.com),如果想了解簡訊介面接入,可以到他們官網,檢視下簡訊介面API文件說明,參考下面的程式碼應該就能弄明白。

使用者註冊部分,主要程式碼如下:

/

/主要js方法:

//獲取手機驗證碼:

function getRegCode() {
if($.trim($('#inputCaptcha').val()) == ''){
$('#imgRs').html("圖形驗證碼不能為空");
$('#inputCaptcha').select();
return;
}

if (!isPhoneNum($('#phoneRe').val())) {
document.getElementById('phoneReInfo').innerHTML = '<font color="red">請填寫有效的11位手機號碼</font>';
} 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 = '<font color="red">該手機號已被註冊</font>';
refreshYzm();
} else {
document.getElementById('phoneReInfo').innerHTML = '<font color="green">該手機號可用</font>';
$.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>
accountFID = myArray[1];
}else if(data == '限制申請'){
document.getElementById('phoneReInfo').innerHTML = '<font color="red">一個手機號碼一天最多隻能申請3次!</font>';
refreshYzm();
}else if(data == '驗證碼錯誤'){
document.getElementById('phoneReInfo').innerHTML = '<font color="red">驗證碼錯誤!</font>';
refreshYzm();
}
},
error : function() {
alert('異常,內部驗證出錯!'+data);
}
});

}
},
error : function() {
alert('異常,驗證出錯!');
}
});
}
var smsCount=parseInt($('#smsCount').val());
smsCount=smsCount<3?smsCount+1:3;
$('#smsCount').val(smsCount);
}

 

// 註冊新使用者
// account 為使用者類

@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 + "");//不是新的一天則次數+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);
}
}
}

 

 


//這是互億無線第三方簡訊介面的傳送簡訊功能部分參考程式碼:

/**
* 傳送簡訊
* @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 mobies,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("&aimcodes="+mobies);
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;
}