发送手机,邮箱验证码

一、发送邮箱,使用hutool工具包

使用aliyun邮箱作为发件邮箱,需要在邮箱中开启代收功能

1、引入依赖

userController代码

   @GetMapping("/sendCodeEmail")public Integer sendCodeEmail(String mel){return userService.sendCodeEmail(mel);}

userService代码

public Integer sendCodeEmail(String email){MailAccount account = new MailAccount();account.setHost("smtp.aliyun.com");account.setPort(25);account.setAuth(true);account.setFrom("这里填入发件邮箱地址。。。");account.setUser("这里填入发件邮箱地址。。。");account.setPass("lj297014");int code = RandomUtil.randomInt(1000, 9999);//使用hutool格式化工具String content = StrUtil.format("您的验证码是:<B>{}<B>", code);MailUtil.send(account, CollUtil.newArrayList(email), "测试邮件发送接口", content, true);return 0;}

二、发送手机验证码

使用aliyun的短信服务

进入阿里云短信服务官网

拿到appcode

UserController代码

@GetMapping("/sendCodeTel")public Integer sendCodeTel(String tel){return userService.sendCodeTel(tel);}

UserService代码

public Integer sendCodeTel(String tel){String host = "https://dfsns.market.alicloudapi.com/data/send_sms";int code = RandomUtil.randomInt(1111, 9999);String result = HttpRequest.post(host).header("Authorization", "APPCODE "+"填入你的appcode码").body(StrUtil.format("content=code:{}&template_id=TPL_0000&phone_number={}", code, tel)).execute().body();JSONObject resultJosn = JSONUtil.parseObj(result);if(resultJosn.get("status").equals("ok")){// mapCodes.put(tel,String.valueOf(code));return 0;}throw new BizException(509,"短信发送失败");}

 三、在注册方法中进行验证

使用hutool中带有缓存时间的map数组<电话或邮箱,验证码>进行存储 

  设置一分钟清理下缓存

在注册方法中拿到mapCode里的验证码和前端传入的验证码进行判断

代码

UserController

    @PostMapping("/rigister")public Integer rigister(@RequestBody UserRegisterDto userRegisterDto){return userService.rigister(userRegisterDto);}

UserService 

 public Integer rigister(UserRegisterDto userRegisterDto) {//使用邮箱验证验证码String email = userRegisterDto.getEmail();String code = userRegisterDto.getCode();String codeMap = mapCodes.get(email, false);if(!codeMap.equals(code)){throw new BizException(600,"邮箱验证码不正确");}
//        //使用手机验证验证码
//        String tel = userRegisterDto.getTel();
//        String code = userRegisterDto.getCode();
//        String codeMap = mapCodes.get(tel, false);
//        if(!codeMap.equals(code)){
//            throw new BizException(600,"邮箱验证码不正确");
//        }boolean ismobile = Validator.isMobile(userRegisterDto.getTel());if(ismobile == false){throw new BizException(503,"请输入正确的手机号");}boolean isemail = Validator.isEmail(userRegisterDto.getEmail());if (isemail == false){throw new BizException(504,"请输入正确的邮箱");}boolean isMatch = ReUtil.isMatch("^\\d{6}$", userRegisterDto.getPassword());if (isMatch == false){throw new BizException(505,"请输入至少6位数字的密码");}User user1 = userDao.selectBytel(userRegisterDto.getTel());if (!ObjUtil.isEmpty(user1)){throw new BizException(506,"用户已经存在");}//插入到用户表userDao.insert(userRegisterDto);return 0;}
}

四、用到的技术,遇到的问题

2、hutool工具代替上面map集合,可设置保存时间

hutool工具对象转换

在查询语句中写上limit 1后,表示找到数据就不再扫描查询后面的表了

验证密码

使用hutool里面的校验工具

可以在网站中找:正则表达式在线测试 | 菜鸟工具 (jyshare.com)

我这里选用的是数字

在使用发短信时,appcode后面要加上个空格

 在注册页面取验证码时,一定要加false,要不然会无限刷新

缓存(Hutool-cache) - 超时-TimedCache - 《Hutool v5.6.0 参考文档》 - 书栈网 · BookStack 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3225839.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

!vue3中defineEmits接收父组件向子组件传递方法,以及方法所需传的参数及类型定义,避免踩坑!

使用说明 1、在子组件中调用defineEmits并定义要发射给父组件的方法 const emits defineEmits([‘foldchange’]) 2、使用defineEmits会返回一个方法&#xff0c;使用一个变量emits(变量名随意)去接收 3、在子组件要触发的方法中&#xff0c;调用emits并传入发射给父组件的方法…

绝地归来!英伟达等提出JeDi:无需微调,个性化图像生成新SOTA![CVPR 2024]

文章链接&#xff1a;https://arxiv.org/pdf/2407.06187 github链接&#xff1a;https://research.nvidia.com/labs/dir/jedi 本文提出了一种无需微调的文本生成图像方法&#xff0c;采用了新颖的联合图像扩散模型。 提出了一种简单且可扩展的数据合成流程&#xff0c;用于生成…

Quartz 核心

一、Quartz 核心 工作原理&#xff1a; Scheduler 是一个计划调度器容器&#xff08;总部&#xff09;&#xff0c;容器里面可以盛放众多的 JobDetail 和 Trigger。当容器启动后&#xff0c;里面的每个 JobDetail 都会根据 Trigger 按部就班自动去执行。JobDetail 是一个可执…

Canvas:掌握图像变换合成与裁剪状态像素操作

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

软件源码购买一般在哪个网站?避坑指南

在数字化转型的浪潮中&#xff0c;软件源码的购买已成为许多企业和个人开发者快速搭建项目、节省开发成本的重要途径。选择合适的购买平台&#xff0c;不仅能确保源码的质量与合法性&#xff0c;还能享受到便捷的交易流程与专业的售后服务。本文小编将为您分享几个常见的软件源…

安卓 APK 安装过程详解

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 开机后连上网线 2. 查看网线的IP地址 3. 检查ADB连接 4. 修改文件权限 步骤 结语 我的其他博客 前言 在安卓设备上安装…

[PM]流程与结构设计

流程图 流程就是为了达到特定目标, 进行的一系列有逻辑性的操作步骤, 由两个及已上的步骤, 完成一个完整的行为过程, 即可称为流程, 流程图就是对这个过程的图形化展示 分类 业务流程图 概念: 描述业务流程的一种图, 通过特定符号和连线表示具体某个业务的处理步骤和过程作…

✈️一文带你入门【NestJS】

✈️引言 在现代Web开发领域&#xff0c;框架和技术的迭代速度令人咋舌。其中&#xff0c;NestJS作为一款基于Node.js的后端框架&#xff0c;以其卓越的设计理念和强大的功能集&#xff0c;迅速吸引了众多开发者的眼球。本文将带你深入了解NestJS的起源、发展&#xff0c;以及…

亚马逊自养号测评环境系统全解析:从注册到下单,一次成号无忧

亚马逊测评的关键在于养号&#xff0c;这是因为测评需要买家账号来操作。而养号不仅仅是让账号能多次使用&#xff0c;更重要的是通过维护让账号更健康、更有价值。很多人容易忽略的是&#xff0c;首次购买&#xff08;首单&#xff09;的成功率和它对账号的重要性。首单成功率…

Leetcode刷题——7 滑动窗口 双指针

注&#xff1a;以下代码均为c 1. 两数之和2&#xff08;输入有序数组&#xff09; // 法1&#xff1a;暴力 vector<int> twoSum1(vector<int>& numbers, int target) {vector<int> ans(2);int n numbers.size();for(int i 0; i < n-1; i){if(i ! 0…

递归(四)—— 初识暴力递归之“打印字符串的全排列”

题目1&#xff1a;序列打印一个字符串的全排列 题目分析&#xff1a;结合一实例来理解题目&#xff0c;str “abc”的全排列就是所求得的序列是 strp[0~2]的所有位的排列组合&#xff0c;strNew {“abc”, “acb”, “bac”, “bca”,”cba”,”cab”} 思路1&#xff1a;枚…

旷野之间3 – CTO 应具备的技能

​​​​​​ 随着技术渗透到商业的各个方面,首席技术官的角色变得越来越具有战略性和多面性。虽然深厚的技术技能仍然是基础,但今天的首席技术官还需要具备领导能力、商业敏锐度、沟通能力等优势。 根据我作为 CTO 的个人经验,我将深入探讨现代 CTO 所需的各种能力,包括:…

vue中,图片在div中按照图片原来大小等比例显示

图片在div中按照图片原来大小等比例显示&#xff0c;可以保证web上显示的图片和实际图片形状一样&#xff0c;保留原始图片效果 实现代码如下&#xff1a; <div style"padding: 0; width:400px;height:400px;position: absolute;border: 1px solid #eff2f6;">…

百问网全志D1h开发板红外控制LVGL界面切换

红外控制LVGL界面切换 1. 测试红外功能 1.1 配置设备树 查看原理图&#xff1a; 可以看到红外对应的引脚号是PG16。 进入目录&#xff1a; cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4修改board.dts&#xff1a; vim board.dts修改引…

MUNIK解读ISO26262:安全计划

前言 当我们进行功能安全开发时&#xff0c;由于整个项目周期和内容较多&#xff0c;因此需要在项目前期对一些问题提前进行规划&#xff1a;比如功能安全开发具体分为几个阶段&#xff0c;应该怎么去做&#xff1f;对于不同的环节&#xff0c;有哪些人员来执行&#xff1f;资…

在网上申请流量卡审核失败,可能是你的年龄有问题!

在网上申请流量卡审核失败&#xff0c;可能是你的年龄有问题&#xff01; 先上个图&#xff1a; ​ 网上的流量卡并不是随意申请的&#xff0c;而是填写申请信息后由运营商进行审核&#xff0c;审核通过后才会发卡&#xff0c;如果你提交的订单没有审核通过&#xff0c;那么大…

体积大的快递怎么寄便宜?如何寄件寄包裹更省钱?

大学毕业了&#xff0c;面对即将到来的工作生活&#xff0c;小李不得不把宿舍里的大包小包打包寄回家。可是&#xff0c;当他真正开始打包行李时&#xff0c;才发现这可不是一件简单的事&#xff1a;衣服、被子、书籍、杂物……这些东西加起来体积不小&#xff0c;想要省钱寄快…

HippoRAG如何从大脑获取线索以改进LLM检索

知识存储和检索正在成为大型语言模型(LLM)应用的重要组成部分。虽然检索增强生成(RAG)在该领域取得了巨大进步&#xff0c;但一些局限性仍然没有克服。 俄亥俄州立大学和斯坦福大学的研究团队推出了HippoRAG&#xff0c;这是一种创新性的检索框架&#xff0c;其设计理念源于人类…

强化学习实战1:OpenAI Gym 实验环境介绍

环境配置 我的 torch 版本是 2.3.0&#xff0c;然后 gym 版本是 0.22.0&#xff0c;python 版本是 3.8 &#xff0c;pygame 版本是 2.6.0 。 首先安装一下 gym&#xff1a; pip install gym0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple然后安装一下 pygame&#xff…

Linux服务器CPU占用率达到100%排查思路

1、找到最耗CPU的进程pid&#xff0c;执行命令 top 2、找到最耗CPU的线程tid // 执行 top -Hp [pid] 定位应用进程对应的线程 tid // 按shift p 组合键&#xff0c;按照CPU占用率排序 > top -Hp 14246 3、将线程pid转化为16进制 // printf "%x\n" [tid] 将tid…