服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java开发完整短信验证码功能的全过程

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

2022-02-17 15:16超哥CG_544 Java教程

利用短信验证码进行身份验证是目前互联网众多产品常用的一种方式,那么这种短信验证功能是如何实现的呢,下面这篇文章主要给大家介绍了关于Java开发完整短信验证码功能的相关资料,需要的朋友可以参考下

 

前言

现代互联网项目中,很多场景下都需要使用一种叫做验证码的技术,常用的有图片验证码,滑块验证码,短信验证码等,本文章描述的就是短信验证码的一个使用教程,从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秒不能重复发送

 

总结

到此这篇关于Java开发完整短信验证码功能的文章就介绍到这了,更多相关Java短信验证码功能内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_41739987/article/details/120713589

延伸 · 阅读

精彩推荐
  • Java教程Java处理Webp图片格式转换的示例代码

    Java处理Webp图片格式转换的示例代码

    这篇文章主要介绍了Java处理Webp图片格式转换的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    nintha6172021-05-30
  • Java教程Java操作excel的三种常见方法实例

    Java操作excel的三种常见方法实例

    这篇文章主要给大家介绍了关于Java操作excel的三种常见方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    经理,天台风好大6692021-09-02
  • Java教程java实现抽奖功能解析

    java实现抽奖功能解析

    这篇文章主要为大家详细介绍了java实现抽奖功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    秀发如云7412021-08-24
  • Java教程java实现冒泡排序算法

    java实现冒泡排序算法

    冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工...

    hebedich3582019-12-15
  • Java教程浅析java消息摘要与数字签名

    浅析java消息摘要与数字签名

    这篇文章给大家分析了关于java消息摘要与数字签名的相关知识点内容,有兴趣的朋友们可以学习下。...

    静默虚空8532021-05-26
  • Java教程JVM核心教程之JVM运行与类加载全过程详解

    JVM核心教程之JVM运行与类加载全过程详解

    我们都知道一个java程序运行要经过编译和执行,但是这太概括了,中间还有很多步骤,下面这篇文章主要给大家介绍了关于JVM核心教程之JVM运行与类加载全...

    AskHarries11142021-04-24
  • Java教程java根据List内对象的属性排序方法

    java根据List内对象的属性排序方法

    下面小编就为大家分享一篇java根据List内对象的属性排序方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Clannad_汐10742021-03-14
  • Java教程Java中Optional的使用指南

    Java中Optional的使用指南

    这篇文章主要给大家介绍了关于Java中Optional使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    申城异乡人11322021-08-02