Spring boot短信验证登录

2023-11-07

一、短信验证码业务

        我用的是第三平台的短信服务,当用户点击发送验证码,会调用短信平台接口,从而给手机发验证码。流程如下:

c

 首先需要工具类,来发送验证码

public class DXMessageUtil {

        public static Boolean sendMessage(Long phone, String code){

            int appId = xxxxxx;
            String appKey = "xxxxxxxxxxxxxxxxxxx";
            String phoneNumber = String.valueOf(phone);
            int templateId = xxxx; // 短信正文模板
            String smsSign = "xxxx";  //签名内容

            //可能获取失败,所以放在try-chach中
            try {
                String[] params = {code};//传入验证码和时间数组,根据短信模板自行调整
                log.info("入参电话:"+phoneNumber);
                log.info("入参验证码:"+code);
                //创建短信调用接口 传入刚刚的应用id 和 key
                SmsSingleSender sender = new SmsSingleSender(appId, appKey);
                //调用方法发送短信  传入国家码 电话号码 模板id 模板参数 签名 扩展码为空 返回参数为空
                SmsSingleSenderResult result = sender.sendWithParam("86", phoneNumber, templateId,params,smsSign,"","");
            } catch(HTTPException e) {
                // HTTP响应码错误
                log.info("HTTP响应码错误!");
                e.printStackTrace();
                return false;
            } catch(JSONException e) {
                // json解析错误
                log.info("json解析错误!");
                e.printStackTrace();
                return false;
            } catch(IOException e) {
                // 网络IO错误
                log.info("网络IO错误!");
                e.printStackTrace();
                return false;
            }
            return true;
        }

    //随机生成6位短信验证码的函数
    public static String random(){
        String x= String.valueOf((int)((Math.random()*9+1)* Math.pow(10,6-1)));
        return x;
    }

    //
    public static boolean isBlank(String str) {
        int strLen;
        if (str == null || (strLen = str.length()) == 0) {
            return true;
        }
        for (int i = 0; i < strLen; i++) {
            if ((Character.isWhitespace(str.charAt(i)) == false)) {
                return false;
            }
        }
        return true;
    }
}

二、短信验证登录业务

        接下来我们看下登录的流程

 登录的代码:

 @RequestMapping("getPhoneCode")
    public ResultJson getPhoneCode(@RequestBody SysUserNewVo sysUserNewVo){
        Long phone = sysUserNewVo.getPhone();
        log.info("getPhoneCode入参:"+phone);

        //1、判断手机号是否为空
        if(StringUtils.isEmpty("phone")){
            return ResultJson.error("手机号不能为空!");
        }
        //2、判断手机号是否符合格式(使用正则表达式实现)
        String regex = "^((11[0-9])|(12[0-9])|(13[0-9])|(14[0-9])|(15([0-9]))|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$";
        if (!Pattern.matches(regex, String.valueOf(phone))) {
            return ResultJson.error("手机号格式不正确!");
        }
        //3、将验证码保存至服务器Redis
        String code = DXMessageUtil.random();
//        redisUtil.set("phoneCode",code,60*10);
        redisUtil.setex("phoneCode",code,60L);
        log.info("出参:生成的验证码:"+redisUtil.get("phoneCode"));
        //4、发送短信验证码
        if(!DXMessageUtil.sendMessage(phone,String.valueOf(redisUtil.get("phoneCode")))){
            return ResultJson.error("验证码发送失败!");
        }
        return ResultJson.ok("验证码发送成功!");
    }

首先是进行判断手机号是否为空、格式是否正确,然后将验证码存入redis中

5@RequestMapping("phoneLogin")
    public ResultJson phoneLogin(@RequestBody SysUserNewVo sysUserNewVo){
        Long phone = sysUserNewVo.getPhone();
        String code = sysUserNewVo.getCode();

        //1、判断手机号是否为空
        if(phone.equals(null)){
            return ResultJson.error("手机号不能为空!");
        }
        //2、判断手机号格式是否正确
        String regex = "^((11[0-9])|(12[0-9])|(13[0-9])|(14[0-9])|(15([0-9]))|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$";
        if (!Pattern.matches(regex, String.valueOf(phone))) {
            return ResultJson.error("手机号格式不正确!");
        }
        //3、判断距离上次发送该类型的验证码是否超过5分钟,失效
        String oldCode = String.valueOf(redisUtil.get("phoneCode"));
        log.info("验证码发送超时进行测试oldCode:"+oldCode);
        //if(!DXMessageUtil.isBlank(oldCode)){
        if((String.valueOf(redisUtil.get("phoneCode")))==null){
            return ResultJson.error("验证码已失效!");
        }
        //4、判断用户是否存在
        SysUserNewVo userInfo = loginService.getUserInfoByPhone(phone);
        if(userInfo==null){
            return ResultJson.error("不存在此用户!");
        }
        String codeRedis = String.valueOf(redisUtil.get("phoneCode"));
        log.info("pLogin的出参code: "+code+"; codeRedis:"+codeRedis+"; phone: "+phone);
        SysUserNewVo x = loginService.phoneLogin(phone,code,codeRedis);
        if(x!=null){
            String token = JwtUtil.createToken(x.getAccount());
            x.setToken(token);
            List<SysRole> roleList = sysRoleService.getRoleById(x.getId());
            x.setRoleList(roleList);
            redisUtil.set("SysUser",JSON.toJSONString(x));
            SysUserNewVo xxx = JSON.parseObject(String.valueOf(redisUtil.get("SysUser")), SysUserNewVo.class);
            redisUtil.set("sysUserAccount",x.getAccount());
            return ResultJson.ok(x);
        }
        return ResultJson.error("验证码输入错误!");
    }

然后判断验证码是否失效,我目前是设置的5分钟,在然后判断用户是否存在。登陆成功后,会将用户的信息存入到token里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring boot短信验证登录 的相关文章

  • 网上传说软件测试培训真的那么黑心吗?都是骗局?

    今天一大早社区群因为 软件测试培训班靠不靠谱 的话题炸开了锅 就客观事实而言 当下的软件测试早已不复当年的混乱 再想说0基础进入软测行业 靠着一路摸爬滚打在工作中从无到有学会软测 如果没有贵人扶持 怕是万难 据相关调查数据显示 有79 53
  • windows server 2008 r2 搭建文件服务器

    windows server 2008 r2 搭建文件服务器 目的需求 在测试环境下模拟公司现状需求 利用windows server 搭建文件服务器 工具必备 1 vmware workstation 2 windows server 2
  • 图像处理中的卷积

    卷积是积分变换的方法 其在许多方面有广泛应用 卷积通过两个函数 f 和 g 生成第三个函数 可以看作是两个变量在某范围内相乘后求和的结果 设 f x g x 是两个可积函数 作积分 可以证明上述积分的存在性 随着x取值的不同 这个积分就定义
  • 展示PyEcharts图表到Django框架前端页面教程(逐步教程)

    官网教程参考 https pyecharts org zh cn web django id django e6 a8 a1 e6 9d bf e6 b8 b2 e6 9f 93 这篇博客与官网一样使用Ajax 不使用ajax 直接填充一个
  • Angular(2+)动画API用法详解

    动画相关的 API 都是在 angular animations里面引入的 import 你想要的API from angular animations 复制代码 trigger 由它触发动画效果 称动画触发器 function trigg
  • 微信小程序 scroll-view

    微信小程序 scroll view 用法 微信官方文档地址 https developers weixin qq com miniprogram dev component scroll view html 微信小程序 scroll vie
  • Docker部署 registry

    系列文章目录 Docker部署 registry Docker搭建 svn Docker部署 Harbor Docker 部署SQL Server 2017 Docker 安装 MS SqlServer Docker部署 Oracle12c
  • 使用WebSocket实现服务端向指定的客户端推送消息

    写这篇博客记录一下自己在用websocket的时候遇到的坑 需求是这样的 需要将activeMq来的数据利用websockt推送给客户端显示出来 有多个服务终端 需要将不同的消息推送到对应的服务终端上 1 服务端代码 需要写一个WebSoc
  • Eureka测试环境、开发环境服务宕机不踢掉处理

    SpringCloud eureka 服务宕机踢掉演示DEMO 版本信息 br springboot 1 5 9 br springcloud Dalston RC1 br 贴重点配置 br server br aidl eureka in
  • 使用Go Test测试单个文件和单个方法

    前置条件 1 文件名须以 test go 结尾 2 方法名须以 Test 打头 并且形参为 t testing T 举例 hello test go package main import testing fmt func TestHell
  • 【Android】在android中配置orientation

    参考资料 横竖屏切换 Activity 清单文件中不设置android configChanges属性时 先销毁onPause onStop onDestroy 再重新创建onCreate onStart onResume 方法 也可以 设
  • 程序员学习网站

    包括框架学习 涉及到Google源码的介绍 转载于 http www ha97 com 2908 html 程序员一般都会浏览哪些网站 转载于 http www ha97 com 2908 html 极客导航 转载于 http www go
  • RMQ(区间最值查询问题)

    简介 RMQ Range Minimum Maximum Query 问题是指 对于长度为 n 的数列 A 回答若干询问 RMQ A i j i j n 返回数列A中下标在 i j 里的最小 大 值 也就是说 RMQ问题是指求区间最值的问题
  • 算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验

    云服务器是一种简单高效 安全可靠 处理能力可弹性伸缩的计算服务 通常来说 平台的每个集群节点被部署在互联网的骨干数据中心 可以独立提供计算 存储 在线备份 托管 带宽等互联网基础设施服务 关注的是高性能吞吐量计算能力 关注的是在一段时间内的
  • 多网卡的情况下收udp组播数据的坑

    多网卡的情况下收udp组播收不到 有可能是如下原因造成 https www cnblogs com xiaouisme p 12658554 html
  • 【设计】OOA、OOD、OOP

    这三者都是 OO Object Oriented 领域的思想 一般我们我们接到产品经理的需求后 开发阶段分这样几个步骤 可行性预研阶段 此阶段评估需求是否合理 能否实现 OOA阶段 此阶段分析用例 定义领域模型 OOD阶段 此阶段定义类图
  • Chat 插件上线,免注册即可使用~

    OpenAI 新上线的 Chat 可谓是火爆出圈 这个语言对话模型可以回答问题 承认错误 挑战不正确的前提 还能帮你修改代码中的 bug Chat 的应用场景很广泛 它可以用于处理多种类型的对话 包括对话机器人 问答机器人和客服机器人等 它
  • 几种常用时钟分频实现方法

    在我们学习中 常常需要对时钟进行分频处理 本文将介绍几种常用分频方法 一 2的整数次幂分频 这种分频很简单 只需要设置一个计数器 对计数器进行计数 计数器的第i位则对应的2的i 1次幂分频 此方法适用于占空比为1 2 如果占空比不为1 2
  • CentOS7安装Docker详细步骤

    查看此文章前强烈建议先看这篇文章 Java江湖路 专栏目录 前言 记录在CentOS7中安装docker的每一个步骤 1 Docker介绍 什么是docker 虚拟化容器技术 Docker基于镜像 可以秒级的启动各种容器 每一种容器都是一个
  • 使用cloudflare-pages托管网站

    欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 如何白嫖省心的CloudFlare Pages服务 完美替代Github Pages 对大陆网络友好 背景 之前自己重新开始写博客了 为了方便本地md笔记 参考个人笔

随机推荐

  • [Orangepi 3 LTS]学习记录(一)

    本章内容基于官方手册 OrangePi 3 LTS H6 用户手册 v2 4 与自己实际操作撰写 准备香橙派开发板 闪迪TF卡 性能会更好一些 TF读卡器 USB转TTL模块 串口调试 HDMI 桌面登录 一 镜像安装 1 版本选择 下载对
  • WAF防火墙

    添加依赖 一下看情况而添加 不确定需不需要 apt get install gcc libpcre3 libpcre3 dev zlib1g dev tengine依赖 sudo apt get install openssl libssl
  • Nginx里的root/index/alias/proxy_pass的意思

    1 alias 别名配置 用于访问文件系统 在匹配到location配置的URL路径后 指向 alias 配置的路径 如 注意alias配置最后一定要有 而root可以没有 location test alias home sftp img
  • LEFT JOIN 和JOIN 多表连接

    转载 https blog csdn net mccand1234 article details 51734713 四张表contract customer customer3 customer4 这是比较熟悉的3张表的连接 SELECT
  • three.js全景视频

    小生最近学习three js 将three js官网提供的网站实例翻译翻译 共同学习 接下来翻译一下 webgl video panorama equirectangular html 运行结果https threejs org examp
  • Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!

    0 前言 注册中心不应仅提供服务注册和发现功能 还应保证对服务可用性监测 对不健康的服务和过期的进行标识或剔除 维护实例的生命周期 以保证客户端尽可能的查询到可用的服务列表 因此本文介绍Nacos注册中心的健康检查机制 1 注册中心的健康检
  • 在线代码编译运行工具

    在线代码编译运行工具 如果需要学习语言 比如练习一些算法 或者跑一些别人写的代码 有一些语言特性不太了解需要写一些简单的 demo 做一些验证 那么先搭建一个环境去跑就有一点麻烦了 无需搭建本地环境的代码在线运行工具就可以派上用场了 在线代
  • Mybatis 中$与#的区别

    1 是将传入的值当做字符串的形式 eg select id name age from student where id id 当前端把id值1 传入到后台的时候 就相当于 select id name age from student w
  • Linux环境里实现FLink项目的Zookeeper与Kafka启动

    1 配置FLink遇到的坑 启动 start cluster sh后提示Permission denied 用sudo会提示Please specify JAVA HOME Either in Flink config conf flink
  • C#串口SerialPort常用属性方法

    SerialPort 属性 BaudRate 获取或设置波特率 BytesToRead 得到 接收到数据的字节数 BytesToWrites 得到送往串口的字节数 DataBits 获取或设置数据位 IsOpen 获取一个值 判断串口是否打
  • SpringBoot结合Redis将Token存入缓存中进行登录

    将登录的Token存储在Redis中可以带来以下好处 提高安全性 将Token存储在Redis中 比将Token保存在本地Cookie或浏览器存储中更加安全 因为攻击者无法访问您的服务器上存储的Token 此外 由于Redis支持设置过期时
  • selenium 使用及定位

    使用find element by 方法只需导入 from selenium import webdriver 使用 find element 方法除了导入 from selenium import webdriver 还要导入 from
  • Java OpenJDK 8u382 Windows x64 Installer

    文章目录 一 Azul 二 Adopt 三 IBM 四 Oracle 一 Azul WEB Page Download Azul Zulu Builds of OpenJDK Windows installer Azul Zulu Buil
  • 干电池升压5V,功耗比较低

    干电池升压5V 功耗10uA PW5100干电池升压5V芯片 输出电容 所以为了减小输出的纹波 需要比较大的输出电容值 但是输出电容过大 就会使得系统的 反应时间过慢 成本也会增加 所以建议使用一个 22uF 的电容 或者两个 22uF 的
  • Java动态规划硬币问题最优值和最优解

    给定不同面额的硬币coins和一个总金额amount 计算并输出可以凑成总金额所需的最少的硬币个数和使用的硬币 网上介绍动态规划的文章已经很多了 我的这篇文章分析了我自己分析硬币问题的算法在二维数组的效能分析 其中用了Intellij ID
  • maven项目如何加载不同的配置文件

    疑惑 公司项目 本地启动时取用默认路径的下的配置文件 而当maven打包时取用另一文件路径下的配置文件 解决过程 首先查找公司项目代码中是否控制本地启动和服务器启动时使用的配置文件不同 但是发现并不是 最后考虑是否是maven打包加载时已经
  • tiktok新号发布的视频播放量为零解决方案

    tiktok新号发布的视频播放量为零解决方案 大家好 我是项柚 一个专注于讨论TikTok玩法的跨境电商自媒体人 每天不断输出干货给需要的朋友 首先我们先来看下0播放的原因 一 伪装度不够 首先我们在打开TikTok之前 你的伪 装度必须是
  • docker容器内安装git服务端

    创建容器 privileged 获得完整的root权限 usr sbin init 启动容器执行的第一个命令 以便可以使用systemctl命令 将容器的ssh服务22端口映射到宿主的65002端口 docker run itd privi
  • 深入学习jquery源码之noConflict()

    深入学习jquery源码之noConflict jQuery noConflict extreme 概述 运行这个函数将变量 的控制权让渡给第一个实现它的那个库 执行 var jq noConflict 后 将不再控制当前的jQuery 而
  • Spring boot短信验证登录

    一 短信验证码业务 我用的是第三平台的短信服务 当用户点击发送验证码 会调用短信平台接口 从而给手机发验证码 流程如下 c 首先需要工具类 来发送验证码 public class DXMessageUtil public static Bo