在本週的項目中用到了一個手機短信驗證的功能,雖然代碼都是已經寫好了的,本身只是拿來就用,但過後仍是得學習一下思路的。api
主要流程以下緩存
基礎功能仍是比較簡單的畢竟發短信用到是現成的接口,本項目用到的短信驗證接口的網站是這個ide
/** * 批量發送短信 * * @param phoneNumbers * @param message 短信內容 * @return 成功200 ,不成功400(短信驗證錯誤或未傳入發送手機號) * @throws IOException */ @Override public Integer sentMessage(Set<String> phoneNumbers, String message) throws IOException { HttpClient client = new HttpClient(); PostMethod post = new PostMethod(sOpenUrl); // 在頭文件中設置轉碼 post.addRequestHeader("Content-Type", ContentType); // 註冊的用戶名 NameValuePair[] data = {new NameValuePair("action", "sendOnce"), // 註冊成功後,登陸網站使用的密鑰 new NameValuePair("ac", account), // 手機號碼 new NameValuePair("authkey", authkey), new NameValuePair("cgid", cgid.toString()), new NameValuePair("c", message), new NameValuePair("m", String.join(",", phoneNumbers))}; // 設置短信內容 post.setRequestBody(data); client.executeMethod(post); post.releaseConnection(); return post.getStatusCode(); }
主要的難點我認爲主要就是:怎麼保存已經發送的驗證碼並判斷是否失效。
在本項目中是直接經過一個服務中的hashMap把驗證碼與手機號的信息直接存到內存中,畢竟本項目同時註冊人數不可能太多,而幾個字符串內存仍是承受的住的。post
HashMap<String, HashMap<String, Object>> hashMap = new HashMap<>(); // 緩存值 String EXPIRE_DATE_KEY = "expireDate"; // 數據失效時間關鍵字(指在某個時間失效) String VALUE_KEY = "value"; // 存數據的KEY // 存放緩存的方法 static void put(String key, Object object, Integer expireTime) { HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put(MemoryCacheService.VALUE_KEY, object); hashMap.put(MemoryCacheService.EXPIRE_DATE_KEY, System.currentTimeMillis() + expireTime * 1000); MemoryCacheService.hashMap.put(key, hashMap); }
經過手機號查詢驗證碼學習
/** * 獲取緩存 * * @param key * @return */ static Object get(String key) { if (MemoryCacheService.shouldClearExpiredData()) { logger.info("按期清除過時緩存"); MemoryCacheService.clearExpiredData(); } HashMap<String, Object> cachedObject = MemoryCacheService.getCachedObjectByKey(key); if (cachedObject == null) { return null; // 未獲取到緩存數據,返回null } if (MemoryCacheService.isExpired(cachedObject)) { logger.info("緩存過時,清除緩存.返回null"); MemoryCacheService.remove(key); return null; } return cachedObjec
本覺得這個功能的博客能寫很多,畢竟仍是讓我感受很新鮮的,但真的開始才發現沒啥重點可寫,限制ip請求次數的功能
還寫掉了,要是詳細寫怎麼實現的感受又不必,畢竟邏輯實際上仍是很簡單的看看流程圖就能理解了,就這樣吧。網站