Java開發完整短信驗證碼功能的全過程
前言
現代互聯網項目中,很多場景下都需要使用一種叫做驗證碼的技術,常用的有圖片驗證碼,滑塊驗證碼,短信驗證碼等,本文章描述的就是短信驗證碼的一個使用教程,從0開始完成一個驗證碼功能的開發。
閑扯
是不是看著導語很高大上!!!
我才不會說是因為最近不知道寫啥才水的一篇文章
但是嘛,我要爭取做到水文章也水的特別認真,讓讀者可以根據本文的教程實現驗證碼功能
使用技術
- Java:所使用的後端技術
- JSP:所使用的前端技術
- 阿裡雲短信服務:發送短信
- Redis:存儲驗證碼 實現超時過期以及驗證功能
所需知識儲備
- Java基礎知識
- Ajax基礎
- Redis基礎
實現步驟
首先我們需要找一個提供短信服務的商戶,隨便在哪裡找都一樣,為瞭避免廣告嫌疑我就不在此推薦瞭,購買商傢的短信服務後會拿到一些參數,比如說請求地址,請求方式,token等,如下圖所示
然後找到接口的調用樣例,按照調用樣例傳相應的參數即可實現短信發送
這步沒什麼說的,就是調用API,完成這步之後,就可以發送短信瞭,當然這個是第一步,距離正式完成還差很遠。
這裡有一個小的細節,就是我們發送短信,其中這個驗證碼是我們自己生成的,然後以參數的形式傳給接口,所以這裡的驗證碼需要我們自己產生 貼一段產生驗證碼的代碼
// 僅供參考 根據業務去生成即可 // 生成驗證碼 StringBuilder builder = new StringBuilder(); for (int i = 0; i < 6; i++) { int random = (int) (Math.random() * 10); builder.append(random); } String code = builder.toString();
第二步要做的操作就是要將第一步發送的驗證碼,如果發送成功瞭的話,我們要將該驗證碼保存起來,方便後續的驗證,本人這裡使用瞭SpringBoot整合Redis,直接使用RedisTemplente實現的,和原生實現是類似的,就是將驗證碼和手機號存入Redis。
// 其中的ResultEntity是我個人封裝的一個返回結果 保存的是發送短信的結果 成功則存入Redis // setRedisKeyValueRemoteWithTimeOut 是自己封裝的一個方法 功能為存入redis並且設置超時時間 // 發送驗證碼到phoneNum 獲取結果 ResultEntity<String> resultEntity = CrowdUtil.sendCodeShortMessage( messageProperties.getHost(), messageProperties.getPath(), messageProperties.getMethod(), phoneNum, "註冊", messageProperties.getAppCode(), messageProperties.getSmsSignId(), messageProperties.getTemplateId()); if (ResultEntity.SUCCESS.equals(resultEntity.getResult())) { // 驗證碼 String code = resultEntity.getData(); // 設置key String key = CrowdConstant.REDIS_CODE_PREFIX + phoneNum; // 如果成功則將驗證碼存入Redis 過期時間300秒 獲取存入redis的結果 ResultEntity<String> saveCodeResultEntity = redisRemoteService.setRedisKeyValueRemoteWithTimeOut(key, code, 300, TimeUnit.SECONDS); if (ResultEntity.SUCCESS.equals(saveCodeResultEntity.getResult())) { return ResultEntity.successWithoutData(); } else { return saveCodeResultEntity; }
第三步實現短信驗證碼的驗證
這步驟實現的功能就是驗證短信驗證碼是否匹配,這步驟核心操作就是將驗證碼從Redis中取出來,和前端傳過來的數據進行比對,貼代碼
// 可以無視其中的一些拼接操作,這些拼接操作就是做一下標識,作為key。 // 核心是getRedisStringValueByKeyRemote方法 作用為獲取Redis中的驗證碼 // 這裡有一個註意事項就是驗證碼使用過一次後需要刪除redis中的數據,避免二次驗證造成的數據不安全。 // 獲取手機號 String phoneNum = memberVO.getCardnum(); // 拼接redis中的key String key = CrowdConstant.REDIS_CODE_PREFIX + phoneNum; // 根據key查詢redis 返回resultEntity 將value存入data ResultEntity<String> redisResultEntity = redisRemoteService.getRedisStringValueByKeyRemote(key); // 獲取結果集 String result = redisResultEntity.getResult(); if (ResultEntity.FAILED.equals(result)) { modelMap.addAttribute(CrowdConstant.ATTR_NAME_MESSAGE, redisResultEntity.getMessage()); return "member-reg"; } // 獲取redis的驗證碼 String redisCode = redisResultEntity.getData(); if (redisCode == null) { modelMap.addAttribute(CrowdConstant.ATTR_NAME_MESSAGE, CrowdConstant.MESSAGE_CODE_NOT_EXISTS); return "member-reg"; } // 獲取輸入的驗證碼 String code = memberVO.getCode(); if (!Objects.equals(redisCode, code)) { modelMap.addAttribute(CrowdConstant.ATTR_NAME_MESSAGE, CrowdConstant.MESSAGE_CODE_FAILED); return "member-reg"; } // 刪除redis中數據 redisRemoteService.removeRedisKeyRemote(key);
到這裡我們驗證碼幾乎就結束瞭,已經實現瞭流程,由於我的那個驗證碼套餐過期瞭,本人又十分貧窮,就沒有測試樣例啦,但是保證是可用的,前端調用方式直接一個Ajax請求調用發送驗證碼存儲redis,然後在例如測試或登錄的業務中,去匹配驗證碼即可。接下來給幾點拓展,各位可以自己實現
- 實現控制單手機號一天隻能發送三條消息。
- 實現控制單ip一天隻能發送是三條消息
- 實現消息60秒不能重復發送
總結
到此這篇關於Java開發完整短信驗證碼功能的文章就介紹到這瞭,更多相關Java短信驗證碼功能內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- java random.nextInt的坑及解決
- Java實現人機對戰猜拳遊戲
- Lombok使用@Tolerate實現沖突兼容問題
- SpringMVC 域對象共享數據的實現示例
- SpringMVC處理數據輸出的實例代碼