利用短信驗(yàn)證碼進(jìn)行身份驗(yàn)證是目前互聯(lián)網(wǎng)眾多產(chǎn)品常用的一種方式,那么這種短信驗(yàn)證功能是如何實(shí)現(xiàn)的呢?就以目前的主流語言java為例為大家介紹一下。
一、準(zhǔn)備工作:
①選擇一家提供java短信接口的短信公司。
②獲得該公司短信接口的短信接口文檔和java短信接口的代碼示例。
二、梳理短信驗(yàn)證碼發(fā)送整個(gè)流程:
①用戶填入手機(jī)號(hào),觸發(fā)獲取驗(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)用接入的短信驗(yàn)證碼接口,并發(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(); try { ? // 發(fā)送請(qǐng)求,第三方短信通信接口參數(shù)設(shè)置:賬號(hào)accName 密碼accPwd 樂信短信api文檔查看地址:http://www.iium.cn/apitext.html responseBody = sendSms(String accName,String accPwd,recPhoneNum,"你的短信驗(yàn)證碼是:"+captcha); // 將驗(yàn)證碼放入session model.addAttribute("captcha", captcha); ? ? // 得到結(jié)果 responseBody = rsp.getBody(); log.debug("getSmsCaptcha: responseBody = " + responseBody); if (rsp.getResult() != "101") { 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; } } private String sendSms(String accName,String accPwd,String mobies,String content){ StringBuffer sb = new StringBuffer("https://www.lx198.com/sdk/send?"); try { sb.append("&accName="+accName); sb.append("&accPwd="+MD5.getMd5String(accPwd)); sb.append("&aimcodes="+mobies); sb.append("&content="+URLEncoder.encode(content,"UTF-8")); sb.append("&bizId="+BizNumberUtil.createBizId()); sb.append("&dataType=string"); 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) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
代碼段③
// 從session取出驗(yàn)證碼 String captcha = session.getAttribute("captcha"); // 比較 if (reqCaptcha.equals(captcha))// 相同通過,則無效化驗(yàn)證碼 session.setAttribute("captcha", null); else // 不通過并提示無效驗(yàn)證碼
以上就是java手機(jī)短信驗(yàn)證碼實(shí)現(xiàn)流程,如還有什么疑問請(qǐng)?jiān)诰€咨詢或撥打400電話:400-6699-521 。