广告
返回顶部
首页 > 资讯 > 精选 >java如何实现短信验证码登录功能
  • 330
分享到

java如何实现短信验证码登录功能

2023-06-25 17:06:27 330人浏览 薄情痞子
摘要

小编给大家分享一下java如何实现短信验证码登录功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!业务案例如下所示,是一个大家熟知的采用短信登录的入口输入手机号之

小编给大家分享一下java如何实现短信验证码登录功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

业务案例

如下所示,是一个大家熟知的采用短信登录的入口

java如何实现短信验证码登录功能

输入手机号之后,出现如下效果,

java如何实现短信验证码登录功能

输入手机上面收到的验证码之后,就可以正常登录了

业务关键点剖析

以上是一个正常的使用短信验证码登录的业务流程,在实际开发中,需要考虑的因素更多了,比如:

  • 验证码位数如何

  • 验证码如何存储

  • 如何预防短信被刷

  • 倒计时功能,前后端如何配合

其实来说,短信验证码功能并不难,难得是如何做到业务场景的全面覆盖和功能细节上面的考虑

短信验证码功能实现思路

小编结合实际经验和调研,目前比较流行的做法是,使用redis做短信验证码,想必说到这里,懂行的同学们应该猜到了

完整的业务逻辑大概如下:

java如何实现短信验证码登录功能

依据这个业务逻辑的实现思路,我们大致可以理清代码的编写逻辑,在小编开发过程中,其中有一个点遇到了一点梗,就是关于验证码的有效期的问题,主要考虑下面2点:

  • 后端存储验证码有效期时长

  • 前端页面倒计时和后端有效期的关系

有效期问题

java如何实现短信验证码登录功能

java如何实现短信验证码登录功能

下面我们编写代码来演示下完整的过程

前置准备:搭建一个SpringBoot工程

操作步骤

1、导入核心依赖

<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-Redis</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-WEB</artifactId>            <version>2.2.1.RELEASE</version>        </dependency>

2、编写获取短信验证码方法

@Servicepublic class SmsServiceImpl implements SmsService {    public static final String VERIFY_CODE = "login:verify_code:";    @Autowired    private DbUserMapper dbUserMapper;    @Autowired    private RedisTemplate<String,String> redisTemplate;    @Override    public String getSmsVerifyCode(String phone) {        if (StringUtils.isEmpty(phone)) {            throw new RuntimeException("用户手机号为空");        }        QueryWrapper queryWrapper = new QueryWrapper();        queryWrapper.eq("mobile",phone);        DbUser dbUser = dbUserMapper.selectOne(queryWrapper);        if(dbUser == null){            throw new RuntimeException("用户不存在");        }        String smsVerifyCode = getSmsVerifyCode();        String smsCodeKey = VERIFY_CODE + dbUser.getUserId();        String existedSmsCode = redisTemplate.opsForValue().get(smsCodeKey);        //如果验证码已经存在时        if (StringUtils.isNotEmpty(existedSmsCode)) {            Long expireTime = redisTemplate.opsForValue().getOperations().getExpire(smsCodeKey);            long lastTime = 60 * 3 - expireTime;            //三分钟内验证码有效,1分钟到3分钟之间,用户可以继续输入验证码,也可以重新获取验证码,新的验证码将覆盖旧的            if(lastTime > 60 && expireTime >0){                //调用第三方平台发短信,只有短信发送成功了,才能将短信验证码保存到redis                System.out.println("此处调用短信发送逻辑......");                redisTemplate.opsForValue().set(smsCodeKey, smsVerifyCode, 60 * 3, TimeUnit.SECONDS);                System.out.println("短信验证码:" + smsVerifyCode);            }            //一分钟之内不得多次获取验证码            if(lastTime < 60){                throw new RuntimeException("操作过于频繁,请一分钟之后再次点击发送");            }        }else {            //调用notify服务发送短信,只有notify的短信发送成功了,才能将短信验证码保存到redis            System.out.println("此处调用短信发送逻辑......");            System.out.println("短信验证码:" + smsVerifyCode);            redisTemplate.opsForValue().set(smsCodeKey, smsVerifyCode, 60 * 3, TimeUnit.SECONDS);        }        return smsVerifyCode;    }        public static String getSmsVerifyCode() {        Random random = new Random();        String code = "";        for (int i = 0; i < 6; i++) {            int rand = random.nextInt(10);            code += rand;        }        return code;    }}

发送短信验证码需充分考虑几个场景:

  • 首次输入手机号,获取验证码时,后端设置验证码有效期为3分钟,前端倒计时1分钟

  • 1分钟之内,用户不能第二次获取验证码,1分钟之后,用户可以重新获取验证码

  • 超过1分钟后,同一个用户再次点击获取验证码时,后端需主动移除redis存储的上一次验证码

  • 3分钟有效期内,用户可随时输入第一次的验证码进行登录

  • 登录成功后,登录接口需主动移除redis中的验证码

以上为验证码的核心业务方法,下面再编写一个登录的方法,当基础校验和验证码校验通过后,即可登录

@Override    public String login(String userId, String smsCode) {        if (StringUtils.isEmpty(userId)) {            throw new RuntimeException("用户ID必传");        }        if (StringUtils.isEmpty(smsCode)) {            throw new RuntimeException("验证码不能为空");        }        QueryWrapper queryWrapper = new QueryWrapper();        queryWrapper.eq("user_id",userId);        DbUser dbUser = dbUserMapper.selectOne(queryWrapper);        if(dbUser == null){            throw new RuntimeException("用户不存在");        }        //校验验证码        String smsCodeKey = VERIFY_CODE + dbUser.getUserId();        String verifyCode = redisTemplate.opsForValue().get(smsCodeKey);        if (StringUtils.isEmpty(verifyCode)) {            throw new RuntimeException("短信验证码不存在或已过期");        }        if (!StringUtils.equals(smsCode, verifyCode)) {            throw new RuntimeException("短信验证码错误");        }        //TODO 其他待验证的登录业务逻辑        System.out.println("执行其他业务......");        System.out.println("登录成功");        //最后清理下验证码        if(redisTemplate.hasKey(smsCodeKey)){            redisTemplate.delete(smsCodeKey);        }        return "login success";    }

3、提供获取验证码和登录接口

@RestControllerpublic class SmsController {    @Autowired    private SmsService smsService;    @GetMapping("get/sms_code")    public String getSmsVerifyCode(@RequestParam("phone") String phone){        return smsService.getSmsVerifyCode(phone);    }        @GetMapping("/login")    public String login(@RequestParam("userId") String userId,@RequestParam("smsCode") String smsCode){        return smsService.login(userId,smsCode);    }}

启动redis服务,启动项目数据库提前准备一条数据

java如何实现短信验证码登录功能

场景测试1:获取验证码

java如何实现短信验证码登录功能

java如何实现短信验证码登录功能

调用登录接口,使用上面的验证码:

java如何实现短信验证码登录功能

场景测试2:1分钟内多次获取验证码

第一次获取验证码

java如何实现短信验证码登录功能

再次获取验证码

java如何实现短信验证码登录功能

java如何实现短信验证码登录功能

超过1分钟少于3分钟内,再次获取验证码,得到新的验证码,同时redis中存储的是最新的验证码

java如何实现短信验证码登录功能

java如何实现短信验证码登录功能

场景测试3:登录输入错误验证码

java如何实现短信验证码登录功能

java如何实现短信验证码登录功能

总体来说,使用redis实现短信验证码登录的功能不算太复杂,主要是需要全面的考虑到各自使用场景即可

以上是“java如何实现短信验证码登录功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: java如何实现短信验证码登录功能

本文链接: https://www.lsjlt.com/news/306190.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java如何实现短信验证码登录功能
    小编给大家分享一下java如何实现短信验证码登录功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!业务案例如下所示,是一个大家熟知的采用短信登录的入口输入手机号之...
    99+
    2023-06-25
  • java短信验证码登录功能设计与实现
    目录前言业务案例业务关键点剖析短信验证码功能实现思路有效期问题操作步骤前言 现在不管是各类的网站,还是大小社交app,登录方式是越来越多了,其中基于短信验证码的登录可以说是各类app...
    99+
    2022-11-12
  • java如何实现短信验证码功能
    要在Java中实现短信验证码功能,你可以按照以下步骤进行操作:1. 选择一个可靠的短信服务提供商:首先,你需要选择一个可靠的短信服务...
    99+
    2023-10-21
    java
  • Java如何实现发送短信验证码功能
    小编给大家分享一下Java如何实现发送短信验证码功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一个发送短信验证码的功能,使用的是信易通的短信平台接口,然后在J...
    99+
    2023-05-30
    java
  • java实现登录验证码功能
    本文实例为大家分享了java实现登录验证码功能的具体代码,供大家参考,具体内容如下 登录验证码 登录验证是大多数登录系统都会用到的一个功能,它的验证方式也是有很多种,例如登录验证码,...
    99+
    2022-11-12
  • Nodejs实现短信验证码功能
    使用Nodejs的开发者愈来越多,基于Nodejs的后台开发也多了起来,像短信验证码、短信群发、国际短信这些需求,完全可以采用第三方接口来实现,云片就提供了这样的接口。 Nodejs // 修改为您的a...
    99+
    2022-06-04
    验证码 短信 功能
  • SSM项目实现短信验证码登录功能的示例代码
    目录1.登入网站 zz短信平台2.导入工具类MessageUtil3.ajax 模块4. html页面5.编写controller层1.登入网站 zz短信平台 http:/...
    99+
    2022-11-13
  • android studio 实现短信验证 登录
    登录 http://www.mob.com/ 注册 创建项目 # 接着帖 我的完整代码 MainActivity package wlt...
    99+
    2022-06-06
    Android Studio studio Android
  • Java简单实现短信验证登录(Session、Redis)
    前端设计 {{codeBtnMsg}} 未注册...
    99+
    2023-09-27
    java redis 前端
  • Java如何实现短信验证码
    本篇内容主要讲解“Java如何实现短信验证码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何实现短信验证码”吧!截图展示实现代码后台接收前台的kgCaptchaToken进行验证,验证...
    99+
    2023-07-05
  • 短信验证码—Java实现
    在业务需求中我们经常会用到短信验证码,比如手机号登录、绑定手机号、忘记密码、敏感操作等,都可以通过短信验证码来保证操作的安全性,于是就记录下了一次开发的过程。 一.架构设计 发送短信是一个比较慢的过程,因为需要用到第三方服务(腾讯云短信...
    99+
    2023-08-17
    java rabbitmq redis 腾讯云 spring boot
  • Redis实现短信验证码登录的示例代码
    目录效果图pom.xmlapplicatoin.ymlRedis配置类controllerserviceImplmapper效果图 发送验证码 输入手机号、密码以及验证码完成登录操作 pom.xml 核心依赖 <...
    99+
    2022-06-13
    Redis短信验证码登录 Redis验证码登录 Redis短信验证码
  • Android实现短信验证功能的代码
    在我们现在开发APP过程中,当用户注册时,短信验证是必不可少的操作,这里我们就是用一个免费的第三方短信验证SDK-MOP 首先看下效果图 获取AppKey和AppSecr...
    99+
    2022-06-06
    Android
  • Nodejs怎么实现短信验证码功能
    这篇文章将为大家详细讲解有关Nodejs怎么实现短信验证码功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用Nodejs的开发者愈来越多,基于Nodejs的后台开发也...
    99+
    2022-10-19
  • 短信验证码校验功能如何利用SpringBoot实现
    本篇文章为大家展示了短信验证码校验功能如何利用SpringBoot实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。思路用户输入手机号后,点击按钮获取验证码。并设置冷却时间,防止用户频繁点击。后台生...
    99+
    2023-05-31
    springboot bo
  • java怎么实现注册的短信验证码功能
    本篇内容介绍了“java怎么实现注册的短信验证码功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!短信验证码实现流程构造手机验证码,生成一个...
    99+
    2023-06-02
  • 怎么用java+maven实现发送短信验证码功能
    这篇文章主要介绍“怎么用java+maven实现发送短信验证码功能”,在日常操作中,相信很多人在怎么用java+maven实现发送短信验证码功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用java+m...
    99+
    2023-06-02
  • 基于 antd pro 的短信验证码登录功能(流程分析)
    目录概要整体流程前端页面代码请求验证码和登录的 service (src/services/login.js)处理登录的 model (src/models/login.js)后端短...
    99+
    2022-11-12
  • Android实现短信验证码自动填写功能
    本实例为大家分享了Android实现短信验证码自动填写功能,供大家参考,具体内容如下 实现思路很简单: 1、在需要输入验证码的Activity代码注册监听短信的广播 2...
    99+
    2022-06-06
    自动 验证码 短信验证码 Android
  • Java web如何实现一个验证码权限登录功能
    今天就跟大家聊聊有关Java web如何实现一个验证码权限登录功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。所用到的开发工具为myeclipse10,MySQL数据库。首先,在m...
    99+
    2023-05-31
    javaweb 验证码 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作