Java开发完整短信验证码功能的全过程
作者:超哥CG_544 发布时间:2023-05-05 15:35:24
目录
前言
闲扯
使用技术
所需知识储备
实现步骤
总结
前言
现代互联网项目中,很多场景下都需要使用一种叫做验证码的技术,常用的有图片验证码,滑块验证码,短信验证码等,本文章描述的就是短信验证码的一个使用教程,从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://blog.csdn.net/qq_41739987/article/details/120713589


猜你喜欢
- 本文实例为大家分享了Java swing 仿QQ账号密码输入框,供大家参考,具体内容如下主要思路是自己定义 AccountPanel 和 P
- 一、创建线程启动线程—start 方法通过覆写 run 方法创建⼀个线程对象,但线程对象被创建出来并不意味着线程就开始运
- 对于一些特殊的情况,split拆分后并没有保留全的元素如下例子:String x ="a,,,,,,";String [
- 算法介绍概念 TF-IDF(term frequency–inverse document
- 单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。普通泛型单例:public abstract cl
- 首先打开vs,右击解决方案,点击管理解决方案的Nuget包管理然后我们点击浏览,搜索log4net,进行安装然后我们需要新建一个名为log4
- 定义MD全称Message-Digest,即信息摘要,所以MD家族的算法也叫信息摘要算法MD家族有MD2、MD3、MD4、MD5,一代比一代
- 前言:线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据
- 一、前言 网上有许多的多线程断点续传操作,但总是写的很云里雾里,或者
- 经典分布式事务,是相对互联网中的柔性分布式事务而言,其特性为ACID原则,包括原子性(Atomictiy)、一致性(Consistency)
- 优点1.观察者和被观察者是抽象耦合的。2.建立一套触发机制。缺点1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知
- 背景:在Android中按照数据保存的方式,可以分为如下几种Content Provider (用的SQLite实现),SQLite,Sha
- 在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下。一:概念首先我们要知道什么是”进程”,什么是“线
- Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册
- 通俗的来说,Jackson是一个 Java 用来处理 JSON 格式数据的类库,其性能非常好。本文就来针对Jackson的用法做一个较为详细
- 可以使用System.ServiceProcess.ServiceController这个类允许连接到正在运行或者已停止的服务、对其进行操作
- json是种常用的数据传输格式,在android开发中,如何借助java语言实现对json数组对象的解析呢,请参阅下面的关键代码:impor
- @Cacheable自定义KeyGenerator1. 概述SpringBoot 使用 @Cacheable 可以方便的管理缓存数据,在不指
- 最近这款“跳一跳”很火,在段子里面看到有人才放了张画着坐标的纸在手机上,说根据
- 什么是JWT,它是一种对API的保护方案,为什么要进行保护呢防泄漏:你肯定不希望你的数据能被别人随意调用,比如公司的机密信息,不可能每个人都