短信驗證

在本週的項目中用到了一個手機短信驗證的功能,雖然代碼都是已經寫好了的,本身只是拿來就用,但過後仍是得學習一下思路的。api

短信驗證總體思路

主要流程以下緩存

clipboard.png

基礎功能仍是比較簡單的畢竟發短信用到是現成的接口,本項目用到的短信驗證接口的網站是這個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請求次數的功能
還寫掉了,要是詳細寫怎麼實現的感受又不必,畢竟邏輯實際上仍是很簡單的看看流程圖就能理解了,就這樣吧。網站

相關文章
相關標籤/搜索