現代互聯網專案中,很多場景下都需要使用一種叫做驗證碼的技術,常用的有圖片驗證碼,滑塊驗證碼,短信驗證碼等,本文章描述的就是短信驗證碼的一個使用教程,從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秒不能重復發送
全面發展,一專多能!!!!!
今天也是一個想進大廠的小菜雞呢!!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310563.html
標籤:java
