java實(shí)現(xiàn)手機(jī)短信驗(yàn)證的基本思路
本文實(shí)例為大家分享了java實(shí)現(xiàn)手機(jī)短信驗(yàn)證的具體代碼,供大家參考,具體內(nèi)容如下
整體流程:
- 客戶填入手機(jī)號(hào),通過客戶端點(diǎn)擊獲取驗(yàn)證碼按鈕,驗(yàn)證手機(jī)號(hào)是否有效,有效則客戶端發(fā)送請(qǐng)求到后臺(tái)服務(wù)器,客戶端開始倒計(jì)時(shí)60s,不通過則返回;
- 服務(wù)器,驗(yàn)證手機(jī)號(hào)是否被注冊(cè)或有效,通過則調(diào)用第三方的短信通信接口并發(fā)送相關(guān)數(shù)據(jù)(包括手機(jī)號(hào)和驗(yàn)證碼),然后回調(diào)結(jié)果,成功則將驗(yàn)證碼存入session,失敗則返回提示,不通過則返回。
- 客戶收到驗(yàn)證碼后在有效時(shí)間內(nèi),填入并發(fā)送請(qǐng)求。
- 服務(wù)器端,收到請(qǐng)求后,用戶發(fā)送過來的驗(yàn)證碼和事前放入session的驗(yàn)證碼做對(duì)比,相同通過,否則提示驗(yàn)證碼無效。
通過后,需要將session中的驗(yàn)證碼無效化,一般就是置為空。
第一步偽代碼:
function sendCaptcha(tel) {
console.log("sendCaptcha: tel = " + tel);
$.ajax({
type: 'post',
url: '/sms/captcha/' + tel,
dataType: "json",
success: function (data) {
console.log("sendCaptcha ==> success: data = " + eval(data));
if (data) {
countdown();
b_code = false;
} else {
alert("您發(fā)送的頻率過快!");
}
},
error: function (data) {
console.log("sendCaptcha ==> error: data = " + eval(data));
alert("網(wǎng)絡(luò)超時(shí)");
clearTimeout(t);
b_code = true;
var msg = "獲取驗(yàn)證碼";
$("#code").text(msg);
c = 60;
}
});
}
第二步偽代碼:
@RequestMapping(value = "captcha/{recPhoneNum}", method = RequestMethod.POST)
public Object getSmsCaptcha(ModelMap model, @PathVariable("recPhoneNum")String recPhoneNum) {
String responseBody = null;
/* 這里驗(yàn)證手機(jī)號(hào)是否被注冊(cè) */
// 生成驗(yàn)證碼
String captcha = Generator.generateCaptcha();
// 第三方短信通信接口參數(shù)設(shè)置
req.setReceive(recPhoneNum);
try {
// 發(fā)送請(qǐng)求
responseBody = req.send();
// 將驗(yàn)證碼放入session
model.addAttribute("captcha", captcha);
// 得到結(jié)果
responseBody = rsp.getBody();
log.debug("getSmsCaptcha: responseBody = " + responseBody);
if (rsp.getResult() != null) {
model.addAttribute("success_response", rsp.getResult());
} else {
model.addAttribute("error_response", rsp.getSubMsg());
}
} catch (ApiException e) {
log.error("getSmsCaptcha :" + e.getErrMsg());
}
// 解析結(jié)果
if (successJson != null) {
successJson = successJson.getJSONObject("result");
return successJson.getBoolean("success");
} else {
return false;
}
}
最后一步偽代碼:
// 從session取出驗(yàn)證碼
String captcha = session.getAttribute("captcha");
// 比較
if (reqCaptcha.equals(captcha))
// 相同通過,則無效化驗(yàn)證碼
session.setAttribute("captcha", null);
else
// 不通過并提示無效驗(yàn)證碼
如有疑問,請(qǐng)指出!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法
- Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼功能
- Android 用RxBinding與RxJava2實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)功能
- Java使用云片API發(fā)送短信驗(yàn)證碼
- Java實(shí)現(xiàn)短信驗(yàn)證碼和國(guó)際短信群發(fā)功能的示例
- java基于正則提取字符串中的數(shù)字功能【如提取短信中的驗(yàn)證碼】
- JAVA實(shí)現(xiàn)利用第三方平臺(tái)發(fā)送短信驗(yàn)證碼
- java servlet手機(jī)app訪問接口(二)短信驗(yàn)證
- 基于JAVA的短信驗(yàn)證碼api調(diào)用代碼實(shí)例
相關(guān)文章
SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持
這篇文章主要介紹了SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java SpringBoot啟動(dòng)指定profile的8種方式詳解
這篇文章主要介紹了spring boot 如何指定profile啟動(dòng)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Mybatis-Plus同時(shí)使用邏輯刪除和唯一索引的問題及解決辦法(報(bào)數(shù)據(jù)重復(fù)Duplicate entry的
在開發(fā)中,我們經(jīng)常會(huì)有邏輯刪除和唯一索引同時(shí)使用的情況,但當(dāng)使用mybatis plus時(shí),如果同時(shí)使用邏輯刪除和唯一索引,會(huì)報(bào)數(shù)據(jù)重復(fù)Duplicate entry的問題,如何解決這個(gè)問題呢,小編給大家分享Mybatis-Plus同時(shí)使用邏輯刪除和唯一索引的問題及解決辦法,一起看看吧2023-11-11
Spring大白話之三級(jí)緩存如何解決循環(huán)依賴問題
Spring通過三級(jí)緩存(singletonObjects、earlySingletonObjects、singletonFactories)解決單例循環(huán)依賴,三級(jí)緩存使用Lambda表達(dá)式提前暴露bean的早期引用,確保在遞歸調(diào)用時(shí)能夠正確獲取對(duì)象實(shí)例,避免死循環(huán)2025-02-02

