最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java開發(fā)完整短信驗證碼功能的全過程

 更新時間:2021年10月13日 11:17:55   作者:超哥CG_544  
利用短信驗證碼進行身份驗證是目前互聯(lián)網(wǎng)眾多產品常用的一種方式,那么這種短信驗證功能是如何實現(xiàn)的呢,下面這篇文章主要給大家介紹了關于Java開發(fā)完整短信驗證碼功能的相關資料,需要的朋友可以參考下

前言

現(xiàn)代互聯(lián)網(wǎng)項目中,很多場景下都需要使用一種叫做驗證碼的技術,常用的有圖片驗證碼,滑塊驗證碼,短信驗證碼等,本文章描述的就是短信驗證碼的一個使用教程,從0開始完成一個驗證碼功能的開發(fā)。

閑扯

是不是看著導語很高大上?。?!

我才不會說是因為最近不知道寫啥才水的一篇文章

但是嘛,我要爭取做到水文章也水的特別認真,讓讀者可以根據(jù)本文的教程實現(xiàn)驗證碼功能

使用技術

  • Java:所使用的后端技術
  • JSP:所使用的前端技術
  • 阿里云短信服務:發(fā)送短信
  • Redis:存儲驗證碼 實現(xiàn)超時過期以及驗證功能

所需知識儲備

  • Java基礎知識
  • Ajax基礎
  • Redis基礎

實現(xiàn)步驟

首先我們需要找一個提供短信服務的商戶,隨便在哪里找都一樣,為了避免廣告嫌疑我就不在此推薦了,購買商家的短信服務后會拿到一些參數(shù),比如說請求地址,請求方式,token等,如下圖所示

然后找到接口的調用樣例,按照調用樣例傳相應的參數(shù)即可實現(xiàn)短信發(fā)送

這步?jīng)]什么說的,就是調用API,完成這步之后,就可以發(fā)送短信了,當然這個是第一步,距離正式完成還差很遠。
這里有一個小的細節(jié),就是我們發(fā)送短信,其中這個驗證碼是我們自己生成的,然后以參數(shù)的形式傳給接口,所以這里的驗證碼需要我們自己產生 貼一段產生驗證碼的代碼

// 僅供參考 根據(jù)業(yè)務去生成即可
	// 生成驗證碼
	StringBuilder builder = new StringBuilder();
	 for (int i = 0; i < 6; i++) {
	     int random = (int) (Math.random() * 10);
	     builder.append(random);
	 }
	 String code = builder.toString();

第二步要做的操作就是要將第一步發(fā)送的驗證碼,如果發(fā)送成功了的話,我們要將該驗證碼保存起來,方便后續(xù)的驗證,本人這里使用了SpringBoot整合Redis,直接使用RedisTemplente實現(xiàn)的,和原生實現(xiàn)是類似的,就是將驗證碼和手機號存入Redis。

	 // 其中的ResultEntity是我個人封裝的一個返回結果 保存的是發(fā)送短信的結果 成功則存入Redis
	 // setRedisKeyValueRemoteWithTimeOut 是自己封裝的一個方法 功能為存入redis并且設置超時時間 
	 // 發(fā)送驗證碼到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;
	     }

第三步實現(xiàn)短信驗證碼的驗證

這步驟實現(xiàn)的功能就是驗證短信驗證碼是否匹配,這步驟核心操作就是將驗證碼從Redis中取出來,和前端傳過來的數(shù)據(jù)進行比對,貼代碼

		// 可以無視其中的一些拼接操作,這些拼接操作就是做一下標識,作為key。
		// 核心是getRedisStringValueByKeyRemote方法 作用為獲取Redis中的驗證碼
		// 這里有一個注意事項就是驗證碼使用過一次后需要刪除redis中的數(shù)據(jù),避免二次驗證造成的數(shù)據(jù)不安全。
        // 獲取手機號
        String phoneNum = memberVO.getCardnum();
        // 拼接redis中的key
        String key = CrowdConstant.REDIS_CODE_PREFIX + phoneNum;
        // 根據(jù)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中數(shù)據(jù)
        redisRemoteService.removeRedisKeyRemote(key);

到這里我們驗證碼幾乎就結束了,已經(jīng)實現(xiàn)了流程,由于我的那個驗證碼套餐過期了,本人又十分貧窮,就沒有測試樣例啦,但是保證是可用的,前端調用方式直接一個Ajax請求調用發(fā)送驗證碼存儲redis,然后在例如測試或登錄的業(yè)務中,去匹配驗證碼即可。接下來給幾點拓展,各位可以自己實現(xiàn)

  1. 實現(xiàn)控制單手機號一天只能發(fā)送三條消息。
  2. 實現(xiàn)控制單ip一天只能發(fā)送是三條消息
  3. 實現(xiàn)消息60秒不能重復發(fā)送

總結

到此這篇關于Java開發(fā)完整短信驗證碼功能的文章就介紹到這了,更多相關Java短信驗證碼功能內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)電腦定時關機的方法

    java實現(xiàn)電腦定時關機的方法

    這篇文章主要介紹了java實現(xiàn)電腦定時關機的方法,首先通過java注冊windows服務程序,再以一個簡單的java程序實現(xiàn)定時關機的功能,非常具有實用價值,需要的朋友可以參考下
    2014-11-11
  • Springboot?RestTemplate設置超時時間的簡單方法

    Springboot?RestTemplate設置超時時間的簡單方法

    學習springboot ,RestTemplate的使用場景非常非常多,比如springcloud中的服務消費,下面這篇文章主要給大家介紹了關于Springboot?RestTemplate設置超時時間的簡單方法,需要的朋友可以參考下
    2022-01-01
  • springboot項目配置多數(shù)據(jù)庫連接的示例詳解

    springboot項目配置多數(shù)據(jù)庫連接的示例詳解

    這篇文章主要介紹了springboot項目配置多數(shù)據(jù)庫連接的示例,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • Spring Boot 添加MySQL數(shù)據(jù)庫及JPA實例

    Spring Boot 添加MySQL數(shù)據(jù)庫及JPA實例

    本篇文章主要介紹了Spring Boot 添加MySQL數(shù)據(jù)庫及JPA,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 在Spring Boot應用程序中使用Apache Kafka的方法步驟詳解

    在Spring Boot應用程序中使用Apache Kafka的方法步驟詳解

    這篇文章主要介紹了在Spring Boot應用程序中使用Apache Kafka的方法步驟詳解,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • Springmvc @PathVariable的用法解析

    Springmvc @PathVariable的用法解析

    這篇文章主要介紹了Springmvc @PathVariable的用法解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解

    Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解

    這篇文章主要介紹了Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • MyBatis配置文件中最常用的設置

    MyBatis配置文件中最常用的設置

    文章主要介紹了MyBatis配置的優(yōu)化方法,包括引用外部的properties配置文件、配置外置以實現(xiàn)環(huán)境解耦、配置文件中最常用的6個核心設置以及三種常用的Mapper注冊方式,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 在項目中直接使用hystrix的流程分析

    在項目中直接使用hystrix的流程分析

    最近由于一些背景原因,需要在項目中需要對接口進行限流。所以就考慮到了直接使用Hystrix,但是呢,又不想直接使用SpringCloud,而是直接引入原生,現(xiàn)在發(fā)現(xiàn)挺好用的,所以記錄下來,需要的朋友參考下吧
    2022-06-06
  • Java線程方法之從線程角色到實戰(zhàn)避坑指南

    Java線程方法之從線程角色到實戰(zhàn)避坑指南

    Java語言支持多線程編程,它允許在同一個程序中同時運行多個線程來執(zhí)行不同的任務,這有助于提高程序的執(zhí)行效率和響應速度,這篇文章主要介紹了Java線程方法之從線程角色到實戰(zhàn)避坑指南的相關資料,需要的朋友可以參考下
    2025-12-12

最新評論

西安市| 五大连池市| 隆安县| 高州市| 逊克县| 南平市| 漳平市| 长宁区| 黄骅市| 垣曲县| 正宁县| 扎鲁特旗| 双城市| 望奎县| 晋城| 托克托县| 花莲县| 新龙县| 临清市| 闵行区| 杂多县| 铜川市| 浙江省| 富宁县| 光泽县| 盈江县| 嘉兴市| 乡城县| 新沂市| 华蓥市| 黄骅市| 清镇市| 鹿泉市| 郴州市| 蕉岭县| 怀安县| 昌图县| 驻马店市| 合肥市| 龙门县| 林西县|