Java开发完整短信验证码功能的全过程

作者:超哥CG_544 时间:2023-05-05 15:35:24 

目录
  • 前言

  • 闲扯

  • 使用技术

  • 所需知识储备

  • 实现步骤

  • 总结

前言

现代互联网项目中,很多场景下都需要使用一种叫做验证码的技术,常用的有图片验证码,滑块验证码,短信验证码等,本文章描述的就是短信验证码的一个使用教程,从0开始完成一个验证码功能的开发。

闲扯

是不是看着导语很高大上!!!

我才不会说是因为最近不知道写啥才水的一篇文章

但是嘛,我要争取做到水文章也水的特别认真,让读者可以根据本文的教程实现验证码功能

使用技术

  • Java:所使用的后端技术

  • JSP:所使用的前端技术

  • 阿里云短信服务:发送短信

  • Redis:存储验证码 实现超时过期以及验证功能

所需知识储备

  • Java基础知识

  • Ajax基础

  • Redis基础

实现步骤

首先我们需要找一个提供短信服务的商户,随便在哪里找都一样,为了避免广告嫌疑我就不在此推荐了,购买商家的短信服务后会拿到一些参数,比如说请求地址,请求方式,token等,如下图所示

Java开发完整短信验证码功能的全过程

然后找到接口的调用样例,按照调用样例传相应的参数即可实现短信发送

Java开发完整短信验证码功能的全过程

Java开发完整短信验证码功能的全过程

这步没什么说的,就是调用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,然后在例如测试或登录的业务中,去匹配验证码即可。接下来给几点拓展,各位可以自己实现

  1. 实现控制单手机号一天只能发送三条消息。

  2. 实现控制单ip一天只能发送是三条消息

  3. 实现消息60秒不能重复发送

来源:https://blog.csdn.net/qq_41739987/article/details/120713589

标签:java,短信,验证码
0
投稿

猜你喜欢

  • Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动

    2023-09-21 00:16:18
  • C#记录消息到日志文件的方法

    2021-09-17 23:10:39
  • 详解在java中进行日期时间比较的4种方法

    2022-09-03 23:35:52
  • Java实现酒店客房管理系统

    2023-11-21 06:58:38
  • Java Swing组件布局管理器之FlowLayout(流式布局)入门教程

    2021-11-08 05:33:06
  • Android以对话框形式制作数字软键盘示例

    2022-12-07 07:37:03
  • 运行java的class文件方法详解

    2021-07-29 03:53:48
  • Java详解表格的创建与使用流程

    2021-06-19 22:58:52
  • Java线程生命周期的终止与复位

    2022-04-22 01:57:01
  • java如何使用Lombok更优雅地编码

    2022-07-24 23:24:50
  • Java 8 动态类型语言Lambda表达式实现原理解析

    2023-08-05 09:04:25
  • Spring实战之@Autowire注解用法详解

    2021-11-17 20:37:19
  • C#如何防止程序多次运行的技巧

    2022-11-10 01:18:59
  • java8中的lambda表达式简介

    2022-09-12 04:14:10
  • IDEA JeeSite框架httpSession.invalidate()无效问题解决方案

    2023-09-23 19:44:24
  • Java项目有中多个线程如何查找死锁

    2023-01-06 06:17:35
  • 通过特性(attribute)为枚举添加更多信息示例

    2023-10-10 09:22:06
  • 详解ArrayList的扩容机制

    2022-06-18 05:56:32
  • Java使用pulsar-flink-connector读取pulsar catalog元数据代码剖析

    2023-11-05 17:25:41
  • Android仿优酷圆形菜单学习笔记分享

    2023-07-31 06:02:31
  • asp之家 软件编程 m.aspxhome.com