SpringBoot实现短信登陆功能

2023-11-06

大家好我是小羽,这段时间做项目用到了手机短信登陆的功能,在此记录一下。欢迎大家来关注我的微信公众号Java小羽。

一、注册阿里云账号

  1. 登陆阿里云,直接用支付宝扫码就可以登陆注册。
  2. 点击控制台

image-20220613090626771

3.点击侧边栏

image-20220613090810710

4.搜索短信服务

image-20220613090854342

5.选择类型

image-20220613091006739

6.进入短信服务中的快速学习,在这里可以用测试短信,不需要备案审核啥的,方便不少

Snipaste_2022-06-13_09-18-07

7.向项目中导入相关Maven依赖

image-20220613092316510

8.因为我们要操作阿里云的API,需要一个密钥,密钥只能给自己看,一旦泄露,相当于拥有你账户的全部权限,(主账户拥有全部权限,就是支付宝登陆的账号),所以要设置一个子账户,并赋予有限的权限,这样即使泄露了,可以将危害程度降低到最低。

点击获取AK

9.设置子账户

image-20220613092900093

image-20220613093045219

10.(重点)此时会获取你的AccessKey ID和AccessKey Secret,当前界面只会出现一次,最好下载CSV文件到本地。

image-20220613093438913

11.给子账户授权(若不授权,则没有权限调用任何功能)

image-20220613093708049

image-20220613093902531

出现以下界面,就添加权限完成

image-20220613093934296

二、代码实现

准备工作做完了,可以代码实现了。

1.记得导入Maven的包,不要忘记这一步了,具体步骤上面截图有。

2.编写发送短信的工具类,其实在上述第8部分截图的页面中,官网给了示例代码,我只是将它封装成了一个工具类。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.*;
import com.aliyuncs.dysmsapi.model.v20170525.*;
/**
 * 短信发送工具类
 */
public class SMSUtils {

   /**
    * 发送短信
    * @param signName 签名
    * @param templateCode 模板
    * @param phoneNumbers 手机号
    * @param param 验证码
    */
   public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){

      DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai","这里填写自己的access-key-id", "填写自己的access-key-secret");
      /** use STS Token
       DefaultProfile profile = DefaultProfile.getProfile(
       "<your-region-id>",           // The region ID
       "<your-access-key-id>",       // The AccessKey ID of the RAM account
       "<your-access-key-secret>",   // The AccessKey Secret of the RAM account
       "<your-sts-token>");          // STS Token
       **/

      IAcsClient client = new DefaultAcsClient(profile);

      SendSmsRequest request = new SendSmsRequest();
      request.setSignName("阿里云短信测试");	//因为使用的是阿里云的短信测试,所以这两行不能更改	
      request.setTemplateCode("SMS_154950909");
      request.setPhoneNumbers(phoneNumbers);//这里传入的是你测试的手机号
      request.setTemplateParam("{\"code\":\""+param+"\"}");//这里传入的是短信验证码

      try {
         SendSmsResponse response = client.getAcsResponse(request);			                 		System.out.println("短信发送成功");
      } catch (ServerException e) {
         e.printStackTrace();
      } catch (ClientException e) {
         System.out.println("ErrCode:" + e.getErrCode());
         System.out.println("ErrMsg:" + e.getErrMsg());
         System.out.println("RequestId:" + e.getRequestId());
      }
   }

}

3.这里还要再设置一个生成短信验证码的工具类

import java.util.Random;

/**
 * 随机生成验证码工具类
 */
public class ValidateCodeUtils {
    /**
     * 随机生成验证码
     * @param length 长度为4位或者6位
     * @return
     */
    public static Integer generateValidateCode(int length){
        Integer code =null;
        if(length == 4){
            code = new Random().nextInt(9999);//生成随机数,最大为9999
            if(code < 1000){
                code = code + 1000;//保证随机数为4位数字
            }
        }else if(length == 6){
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if(code < 100000){
                code = code + 100000;//保证随机数为6位数字
            }
        }else{
            throw new RuntimeException("只能生成4位或6位数字验证码");
        }
        return code;
    }

    /**
     * 随机生成指定长度字符串验证码
     * @param length 长度
     * @return
     */
    public static String generateValidateCode4String(int length){
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
}

到这里工具类就配置齐全了,接下来就是调用了。

4.这是发送短信的功能模块

/**
 * 发送手机短信
 * @param user
 * @return
 */
@PostMapping("/sendMsg")
public R<String> sendMsg(@RequestBody User user, HttpSession session){
    //获取手机号
    String phone = user.getPhone();

    if(StringUtils.isNotEmpty(phone)){
        //生成随机验证码
        String code = ValidateCodeUtils.generateValidateCode(4).toString();
        log.info("code={}",code);

        //调用阿里云发送短信
        SMSUtils.sendMessage("阿里云测试","",phone,code);


        //需要将验证码保存到Session中
        session.setAttribute(phone,code);

        return R.success("手机验证码发送成功");
    }


    return R.error("短信发送失败");//R.error是我自己封装的返回类,返回值大家可以根据自己的需求修改。
}

5.验证用户验证码登陆的功能模块,这里使用了MyBatisPlus。

/**
 * 移动端用户登陆
 * @param map
 * @return
 */
@PostMapping("/login")
public R<User> login(@RequestBody Map map, HttpSession session){
    log.info(map.toString());

    //获取手机号
    String phone = map.get("phone").toString();

    //获取验证码
    String code = map.get("code").toString();

    //从session中获取保存的验证码
    Object codeInSession = session.getAttribute(phone);

    //如果比对成功,说明登陆成功
    if(codeInSession != null && codeInSession.equals(code)){

        //判断当前手机号对应的用户是否为新用户,如果是新用户则注册
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>();
        wrapper.eq(User::getPhone,phone);
        User one = userService.getOne(wrapper);
        if(one == null){
            //用户不存在,则新增用户
            one=new User();
            one.setPhone(phone);
            one.setStatus(1);
            userService.save(one);
        }
        session.setAttribute("user",one.getId());
        return R.success(one);
    }
    return R.error("登陆失败");
}

6.这里是封装的返回结果类,不需要的可以忽略

import lombok.Data;
import java.util.HashMap;
import java.util.Map;

/**
 * @author shenyi
 * @date 2019/12/18
 * @description 通用返回结果类
 */
@Data
public class R<T> {

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据

    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        return r;
    }

    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}

谢谢大家观看,若有不合理的地方,欢迎大家在评论中指出问题。想要了解更多的Java知识,欢迎大家来关注我的微信公众号Java小羽

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

SpringBoot实现短信登陆功能 的相关文章

随机推荐

  • oauth2.0的配置信息AuthorizationServerConfigurerAdapter

    继承AuthorizationServerConfigurerAdapter方法的配置 Configuration EnableAuthorizationServer public class Oauth2ServerConfig exte
  • 求解矩阵最小路径和(详细分析)

    求解矩阵最小路径和 给定一个m行n列的矩阵 从左上角开始每次只能向右或者向下移动 最后到达右下角的位置 路径上的所有数字累加起来作为这条路径的路径和 如下面一个4行4列的矩阵 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0
  • Flutter插件开发集成aar包出现:Could not determine the dependencies of task ':flutter_vpn:compileDebugAidl'.问题

    概述 最近在做一个Flutter的插件开发 需要在android及ios原生中集成sdk 然后Flutter通过插件调用sdk的方法 这其中涉及到aar包的集成 虽然是Flutter的插件开发 但是关于android原生的aar包集成还是差
  • 网络--tcp协议中控制位

    网络层中的tcp协议 首先看一下tcp的报头信息 其中其余的好理解 但是它是拥有了6个控制位的 说明了此次报文段的性质 紧急URG URGent 当URG等于1时 表明紧急指针字段有效 它告诉系统此报文段中有紧急数据 应尽快传送 相当于高优
  • MySQL 索引 详解(保姆级教程)

    一 索引概述 索引是帮助 MySQL 高效获取数据的数据结构 有序 在数据之外 数据库系统还维护着满足特定查找算法的数据结构 这些数据结构以某种方式引用 指向 数据 这样就可以在这些数据结构上实现高级查询算法 这种数据结构就是索引 二 索引
  • STM32学习日记--Day3--PWM驱动LED灯

    PWM基本结构 主函数 include stm32f10x h Device header include Delay h include OLED h include PWM h uint8 t i int main void OLED
  • Java --- JVM堆的概述与内存细分

    目录 一 堆 二 堆的内存细分 一 堆 1 一个JVM实例只存在一个堆内存 堆也是Java内存管理的核心区域 2 Java堆区在JVM启动的时候即被创建 其空间大小也就确定了 是JVM管理的最大一块内存空间 堆内存的大小是可以调节的 参考代
  • 典型MOSFET制造工艺流程示意图

    复旦大学姜玉龙的课程 半导体器件 截图 图中有的红点是鼠标 下面将阐述这个工艺过程 硅片基底 假设厚度800um 实际上只有上表层有用大概10um厚度左右 然后填充氧化物 用来隔离 然后进行阱注入 可以选择两边分别注入N阱或者P阱 从而隔开
  • 刷题网站

    力扣 这个网站中题解真的是非常丰富 适合新手刷题 不会的可以看看题解 而且适合于练习各种常见的算法 面试求职 英文网址 https leetcode com 中文网址 https leetcode cn com 最近在备战蓝桥杯的时候发现一
  • Python的递归深度问题

    1 Python默认的递归深度是有限制的 当递归深度超过默认值的时候 就会引发RuntimeError 理论在997 2 解决方法 最大递归层次的重新调整 解决方式是手工设置递归调用深度 import sys sys setrecursio
  • 可动态增加、删除的全局蒙灰弹层

    import React Component from react import PropTypes from prop types import assign from object assign import from lodash i
  • 如何编写 Kubernetes 的 YAML 文件?

    声明 本文出自 CNCF 帖子最初发表于 ARMO 由研发副总裁兼联合创始人 Ben Hirschberg 撰写 已获得授权 感谢 山河已无恙 整理 西狩xs 校对 以下为翻译全文 分享给大家 尽管 Kubernetes 越来越受欢迎 但它
  • 如何使用OpenCV保存.mp4格式文件

    fourcc cv2 VideoWriter fourcc mp4v out cat cv2 VideoWriter save mp4 fourcc 24 640 360 True 保存位置 格式 out cat write image 保
  • ElementUI 之el-table-column 格式化属性(日期格式化)

    如果想对表格某一列的内容格式化 性别 日期显示 可用 formatter 属性 实战 日期显示 在method 定义formatDate 方法 formatDate row column 获取单元格数据 let data row colum
  • 数组和指针笔试题解析之【指针】

    目录 笔试题1 笔试题2 笔试题3 笔试题4 笔试题5 笔试题6 笔试题7 笔试题8 笔试题1 int main int a 5 1 2 3 4 5 int ptr int a 1 printf d d a 1 ptr 1 return 0
  • 微信小程序项目源码-50套微信小程序毕业设计的项目实战(附源码+论文+演示视频)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 今天给大家分享50 基于微信小程序的毕业设计 这些项目都经过精心挑选 涵盖了不同的实战主题和用例 可做毕业设计和课程设计参考 除了源码 对于大部分项目实现的功能都有相应的介绍 并且配有
  • docker基础篇-----02-----docker帮助命令、镜像命令、容器命令

    参考文章 学习笔记 尚硅谷周阳老师的Docker教程学习笔记 一 Docker常用命令 1 docker帮助命令 1 查看docker版本 docker version 2 查看docker信息 docker info 3 docker帮助
  • DeFi进化之路

    DeFi经过两年多的蛰伏 在2020年夏天爆发 本文谨代表作者个人观点 不代表火星财经立场 该内容旨在传递更多市场信息 不构成任何投资建议 来源 蓝狐笔记 DeFi经过两年多的蛰伏 在2020年夏天爆发 从6月中旬到现在 仅仅过了三个月的时
  • 【Chatgpt 公众号问答】使用python编写 带上下文 多端部署实现

    效果展示 功能列 多端部署 有多种部署方式可选择且功能完备 目前已支持个人微信 微信公众号和企业微信应用等部署方式 基础对话 私聊及群聊的消息智能回复 支持多轮会话上下文记忆 支持 GPT 3 GPT 3 5 GPT 4模型 语音识别 可识
  • SpringBoot实现短信登陆功能

    大家好我是小羽 这段时间做项目用到了手机短信登陆的功能 在此记录一下 欢迎大家来关注我的微信公众号Java小羽 一 注册阿里云账号 登陆阿里云 直接用支付宝扫码就可以登陆注册 点击控制台 3 点击侧边栏 4 搜索短信服务 5 选择类型 6