Java集成【邮箱验证找回暗码】功能

[复制链接]
发表于 2025-9-21 20:11:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
一.发送邮箱验证码
1.添加依靠
2.选择一个本身的邮箱,作为发件人脚色。
3.编写邮箱设置【设置发件人邮箱】
4.编写邮箱设置类
5.编写controller业务代码
6.演示结果
7.总结流程
8.注意
二.下载、启动、毗连redis
1.下载redis
2.设置redis暗码
3.启动redis
4.Redis图形化界面工具的下载和使用
三.在Java中,操纵redis
1.先容Spring Data Redis
2.Spring Data Redis的操纵步调
3.结果展示
四.验证【邮箱验证码】的准确性
1.题目分析
2.代码
3.结果展示
五.重置用户的暗码
1.题目分析
2.代码
3.结果展示
六.编写前端页面
1.点击【忘记暗码】,跳转到找回暗码页面
2.输入用户名、邮箱,点击【发送验证码】
3.邮箱吸收到验证码后,将其填写到输入框中,然后点击【提交】按钮
4.身份验证通过后,输入新暗码(要输入两次,以防万一),点击【重置】按钮
结语


一.发送邮箱验证码

1.添加依靠

  1. <!--导入邮箱依赖-->
  2. <dependency>
  3.     <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-starter-mail</artifactId>
  5.     <version>3.1.5</version>
  6. </dependency>
复制代码
2.选择一个本身的邮箱,作为发件人脚色。

           说白了,用户找回暗码时,须要发件人发送给用户邮箱一个验证码,那么这个发件人邮箱,须要我们本身选取。
          此时我就选择用我本身的QQ邮箱,作为发件人。
          下面就须要我们去QQ邮箱,开启POP3/SMTP服务,获取授权码。
  





3.编写邮箱设置【设置发件人邮箱】

           我们在【2】中,选取了我们本身的QQ邮箱,充当发件人脚色。
          那么我们此时,就须要将该QQ邮箱的设置信息(包罗账号、授权码等等),设置到Java的application.yml文件中。
          设置好以后,Java就可以在须要时,主动使用我们的QQ邮箱,给忘记暗码的用户的邮箱发送验证码了。
  


4.编写邮箱设置类

   着实【3】就够用了,但是偶然间只完成3的设置,仍然无法注入JavaMailSender的实例。
  1. @Configuration
  2. public class MailConfig {
  3.     @Bean
  4.     public JavaMailSender javaMailSender() {
  5.         JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
  6.         // 设置QQ邮箱SMTP服务器
  7.         mailSender.setHost("smtp.qq.com");
  8.         mailSender.setPort(587);  // QQ邮箱默认端口587(TLS)或465(SSL)
  9.         // 设置邮箱账号和授权码(注意:password是授权码,不是QQ密码)
  10.         mailSender.setUsername("发件邮箱账号");
  11.         mailSender.setPassword("授权码");
  12.         // 设置编码
  13.         mailSender.setDefaultEncoding("UTF-8");
  14.         // 设置SMTP协议属性
  15.         Properties props = mailSender.getJavaMailProperties();
  16.         props.put("mail.smtp.auth", "true");          // 启用认证
  17.         props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
  18.         props.put("mail.smtp.starttls.required", "true"); // 必须使用TLS
  19.         return mailSender;
  20.     }
  21. }
复制代码


5.编写controller业务代码

           由于发送邮件内容不多,以是我们就将全部代码都写到一个controller层即可,就不再创建service层了。
  1. @RestController//表明这是一个controller层,并且自动将对象转为JSON格式返回
  2. @RequestMapping("/api/email")//该controller的访问路径
  3. public class SendEmailController {
  4.     @Autowired
  5.     private JavaMailSender javaMailSender;
  6.     @Autowired
  7.     private UserMapper userMapper;
  8.     //发送邮件
  9.     @PostMapping("/sendEmail")
  10.     public Result sendEmail(@RequestBody EmailDto emailDto){
  11.         //1.先查找数据库,是否存在该用户的账号,如果不存在,则返回错误信息“该账号不存在”
  12.         User user = userMapper.queryUserByUsername(emailDto.getUsername());
  13.         if(user == null){
  14.             return new Result(404, "该账号不存在");
  15.         }
  16.         //2.如果该账号存在,则判断该邮箱是否绑定了该账号,如果没绑定,则返回错误信息“账号与邮箱未绑定”
  17.         if(!user.getEmail().equals(emailDto.getEmail())){
  18.             return new Result(404, "账号与邮箱未绑定");
  19.         }
  20.         //3.如果绑定了,则往该用户的邮箱中,发送一个验证码(多少位自己决定,一般是6位)
  21.         //生成6位验证码
  22.         Random random = new Random();
  23.         int code = random.nextInt(900000) + 100000;//范围:100000-999999(6位随机数的范围)。
  24.         SimpleMailMessage message = new SimpleMailMessage();
  25.         message.setFrom("发件人邮箱");//设置发件人邮箱
  26.         message.setTo(emailDto.getEmail());//设置收件人邮箱
  27.         message.setSubject("东软HIS系统验证码");//邮件标题
  28.         message.setText("邮箱验证码为:" + code + ",请勿发送给他人");//邮件内容
  29.         try {
  30.             javaMailSender.send(message);
  31.             //4.将该验证码存入redis,有效时间设置为2分钟,以便后续验证该用户在前端输入的验证码是否正确。TODO
  32.             return new Result(200, "发送成功");
  33.         }catch (Exception e){
  34.             throw new RuntimeException("发送邮箱验证码失败,请稍后再试");
  35.         }
  36.         
  37.     }
  38. }
复制代码
6.演示结果

   情况1:账号不存在
  

   情况2:账号与邮箱未绑定
  

   情况3:账号与邮箱绑定。
  



可见此时我们的QQ小号的邮箱[email protected]也确实收到了这个邮箱验证码。

7.总结流程

   ①找一个本身的邮箱(QQ、163、outlook等都可以),作为发件人,并将该邮箱的信息设置到java后端
  ②收件人的邮箱,是从前端传递过来的(即:谁忘记了暗码,谁就输入他本身的邮箱,作为验证码的收件人)。
  ③验证码发送乐成后,应当存入redis,并设置有效时间(如:2分钟),以便用户在前端输入验证码后,验证准确性。
  
8.注意

   上述发送邮箱验证码乐成后,应当将验证码存入redis,我们此时还没写写部门内容,稍后会完善的。
    我们上述例子中,发件人是我的QQ大号的邮箱(不方便透露,以是打码了), 收件人是我的QQ小号的邮箱[email protected]。
  
二.下载、启动、毗连redis

1.下载redis

   去redis官网:
  官网:https://redis.io
中文网:https://www.redis.net.cn/
   选择对应操纵体系的安装包:
  

   Redis的Windows版属于绿色软件(说白了就是一个压缩包),直接解压即可使用,解压后的目次结构如下:
  

2.设置redis暗码

   redis默认没有暗码,肯定是不安全的,因此要在设置文件中,设置一个暗码:
  



3.启动redis

   第一步:解压Windows操纵体系对应的Redis压缩包,到D:\develop_tools目次下
  

   第二步:启动Redis服务
  




4.Redis图形化界面工具的下载和使用

   我们使用RESP这款redis图形化界面工具:
  

   使用图形化界面工具RESP,毗连redis:
  

   毗连乐成后的界面如下:
  




三.在Java中,操纵redis

1.先容Spring Data Redis

           要想通过Java操纵Redis,须要借助“Redis的Java客户端” —— Spring Data Redis
  Spring Data Redis是Spring的一部门,对Redis底层开发包举行了高度封装。在Spring项目中,可以使用Spring Data Redis来简化操纵。
          注意:Redis的Java客户端有许多,我们只是选择了其中的一种,也就是Spring Data Redis。
  2.Spring Data Redis的操纵步调

   ①导入Spring Data Redis的maven坐标
  1. <!--导入spring data redis的依赖-->
  2. <dependency>
  3.    <groupId>org.springframework.boot</groupId>
  4.    <artifactId>spring-boot-starter-data-redis</artifactId>
  5.    <version>3.2.7</version>
  6. </dependency>
复制代码
  ②设置Redis数据源
      此处我的Redis暗码是root,这个暗码是后来本身设置的,我在前面文章里讲到过这一操纵。
      注意:Redis数据库有16个库,分别是DB0 ~ DB15,我们上面指定使用DB0这个库。
  假如在yml设置文件中不指定使用哪一个库,则默认使用DB0这个库。
  

   ③在须要时,直接注入StringRedisTemplate实例即可。
  


3.结果展示

   使用ApiFox发送哀求:
  

   相应信息: 
  




           可见此时,确实给用户casually的邮箱[email protected]发送了6位验证码567801。同时也确实将该验证码存入了redis中, 且逾期时间为90秒。
          后续就可以根据redis中存入的验证码,来判定用户前端输入的邮箱验证码是否准确。假如用户输入的验证码和redis中的同等,则分析是本人,就给他修改暗码的权限;假如用户输入的验证码和redis中的差异等,则分析不是本人,直接提示错误信息即可。
  

四.验证【邮箱验证码】的准确性

1.题目分析

           上面,我们已经学习了怎样向用户的邮箱发送一个6位的验证码,并将该验证码存入了redis中。
          下面,我们就要编写【验证邮箱验证码】的功能了。即:用户在前端输入邮箱验证码,要和redis中的举行对比,假如准确,则通过身份验证;假如不准确,则不通过身份认证。
  2.代码

  1. //验证用户输入的验证码是否正确
  2. @PostMapping("/checkCode")
  3. public Result checkCode (@RequestBody EmailDto emailDto){
  4.     //取出该用户在redis中存储的正确邮箱验证码
  5.     String trueCode = stringRedisTemplate.opsForValue().get(emailDto.getEmail());
  6.     if(trueCode == null){
  7.         return new Result(400, "验证码已失效,请重新获取");
  8.     }
  9.     //将用户输入的验证码,与trueCode进行对比,如果一致,则通过身份验证;如果不一致,则返回错误信息
  10.     if(!emailDto.getCode().equals(trueCode)){
  11.         return new Result(400, "验证码错误");
  12.     }else{
  13.         return new Result(200, "验证码正确");
  14.     }
  15. }
复制代码
3.结果展示



五.重置用户的暗码

1.题目分析

   当用户的验证码输入准确后,则通过身份验证。
  下一步就是要修改该用户的暗码了。
  2.代码

   controller层:
  1. //根据用户名,重置用户的密码【找回密码功能】
  2. @PatchMapping("/{username}/updateUserPwdByUserName")
  3. public Result updateUserPwdByUserName(@PathVariable String username, @RequestBody UserDto userDto){
  4.     //预览传来的参数
  5.     /*System.out.println("用户名:" + username + ", 密码:" + userDto.getPassword());*/
  6.     int i = userService.updateUserPwdByUserName(username, userDto);
  7.     if(i > 0){
  8.         return new Result(200, "重置成功");
  9.     }else{
  10.         return new Result(400, "重置失败");
  11.     }
  12. }
复制代码
  service层
  1. //根据用户名,重置用户的密码【找回密码功能】
  2. public int updateUserPwdByUserName(String username, UserDto userDto);
复制代码
  serviceImpl层
  1. //根据用户名,重置用户的密码【找回密码功能】
  2. public int updateUserPwdByUserName(String username, UserDto userDto){
  3.     //先将用户的明文密码加密,在传入mapper层,存入数据库
  4.     String encodedPassword = passwordEncoder.encode(userDto.getPassword());
  5.     int i = userMapper.updateUserPwdByUserName(username, encodedPassword);
  6.     return i;
  7. }
复制代码
  mapper层
  1. //根据用户名,重置用户的密码【找回密码功能】
  2. @Update("update user set password = #{encodedPassword} where username = #{username} ")
  3. public int updateUserPwdByUserName(String username, String encodedPassword);
复制代码

3.结果展示


 

六.编写前端页面

           由于本篇文章主要学习如安在后端发送邮箱验证码,因此前端的代码我们就不展示了。直接展示页面即可。
  1.点击【忘记暗码】,跳转到找回暗码页面



跳转到了找回暗码的界面。
2.输入用户名、邮箱,点击【发送验证码】


   注:点击【发送验证码】按钮,哀求的是【三】中的谁人后端接口。
  3.邮箱吸收到验证码后,将其填写到输入框中,然后点击【提交】按钮



   注:点击【提交】按钮,哀求的是【四】中的谁人后端接口。
  输入验证码后,点击【提交】按钮,会表现身份验证通过。

4.身份验证通过后,输入新暗码(要输入两次,以防万一),点击【重置】按钮


    注:点击【重置】按钮,哀求的是【五】中的谁人后端接口。
  点击重置:



可见,重置暗码乐成后,几秒后就返回了登录页面,此时我们就可以根据新暗码举行登录操纵了。


结语

           本篇文章,焦点点是学会使用JavaMailSender 给某个邮箱发送验证码(邮件)。其次,要重点把握redis的根本使用。
          然后,就是检验我们springboot的根本使用是否熟练了,以及是否会使用ApiFox模仿前端向后端发送哀求。
          末了,就是我们的前端(特指vue、elelment-plus组件库等)是否熟练操纵。
  以上就是Java集成【邮箱验证找回暗码】功能的具体过程。
喜欢本篇文章的话,可以留个免费的关注呦~~

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表