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

目录

一.发送邮箱验证码

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.添加依赖

<!--导入邮箱依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>3.1.5</version>
</dependency>

2.选择一个自己的邮箱,作为发件人角色。

        说白了,用户找回密码时,需要发件人发送给用户邮箱一个验证码,那么这个发件人邮箱,需要我们自己选取。

        此时我就选择用我自己的QQ邮箱,作为发件人。

        下面就需要我们去QQ邮箱,开启POP3/SMTP服务,获取授权码

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

        我们在【2】中,选取了我们自己的QQ邮箱,充当发件人角色。

        那么我们此时,就需要将该QQ邮箱的配置信息(包含账号、授权码等等),配置到Java的application.yml文件中。

        配置好以后,Java就可以在需要时,自动使用我们的QQ邮箱,给忘记密码的用户的邮箱发送验证码了。

4.编写邮箱配置类

其实【3】就够用了,但是有时候只完成3的配置,仍然无法注入JavaMailSender的实例。

@Configuration
public class MailConfig {
    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

        // 设置QQ邮箱SMTP服务器
        mailSender.setHost("smtp.qq.com");
        mailSender.setPort(587);  // QQ邮箱默认端口587(TLS)或465(SSL)

        // 设置邮箱账号和授权码(注意:password是授权码,不是QQ密码)
        mailSender.setUsername("发件邮箱账号");
        mailSender.setPassword("授权码");

        // 设置编码
        mailSender.setDefaultEncoding("UTF-8");

        // 设置SMTP协议属性
        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.smtp.auth", "true");          // 启用认证
        props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
        props.put("mail.smtp.starttls.required", "true"); // 必须使用TLS

        return mailSender;
    }
}

5.编写controller业务代码

        由于发送邮件内容不多,所以我们就将所有代码都写到一个controller层即可,就不再创建service层了。

@RestController//表明这是一个controller层,并且自动将对象转为JSON格式返回
@RequestMapping("/api/email")//该controller的访问路径
public class SendEmailController {
    @Autowired
    private JavaMailSender javaMailSender;
    @Autowired
    private UserMapper userMapper;

    //发送邮件
    @PostMapping("/sendEmail")
    public Result sendEmail(@RequestBody EmailDto emailDto){
        //1.先查找数据库,是否存在该用户的账号,如果不存在,则返回错误信息“该账号不存在”
        User user = userMapper.queryUserByUsername(emailDto.getUsername());
        if(user == null){
            return new Result(404, "该账号不存在");
        }
        //2.如果该账号存在,则判断该邮箱是否绑定了该账号,如果没绑定,则返回错误信息“账号与邮箱未绑定”
        if(!user.getEmail().equals(emailDto.getEmail())){
            return new Result(404, "账号与邮箱未绑定");
        }
        //3.如果绑定了,则往该用户的邮箱中,发送一个验证码(多少位自己决定,一般是6位)
        //生成6位验证码
        Random random = new Random();
        int code = random.nextInt(900000) + 100000;//范围:100000-999999(6位随机数的范围)。
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("发件人邮箱");//设置发件人邮箱
        message.setTo(emailDto.getEmail());//设置收件人邮箱
        message.setSubject("东软HIS系统验证码");//邮件标题
        message.setText("邮箱验证码为:" + code + ",请勿发送给他人");//邮件内容
        try {
            javaMailSender.send(message);
            //4.将该验证码存入redis,有效时间设置为2分钟,以便后续验证该用户在前端输入的验证码是否正确。TODO
            return new Result(200, "发送成功");
        }catch (Exception e){
            throw new RuntimeException("发送邮箱验证码失败,请稍后再试");
        }
        
    }

}

6.演示效果

情况1:账号不存在

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

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

可见此时我们的QQ小号的邮箱2037730735@qq.com也确实收到了这个邮箱验证码。

7.总结流程

①找一个自己的邮箱(QQ、163、outlook等都可以),作为发件人,并将该邮箱的信息配置到java后端

②收件人的邮箱,是从前端传递过来的(即:谁忘记了密码,谁就输入他自己的邮箱,作为验证码的收件人)。

③验证码发送成功后,应当存入redis,并设置有效时间(如:2分钟),以便用户在前端输入验证码后,验证正确性。

8.注意

上述发送邮箱验证码成功后,应当将验证码存入redis,我们此时还没写写部分内容,稍后会完善的。

我们上述例子中,发件人是我的QQ大号的邮箱(不方便透露,所以打码了), 收件人是我的QQ小号的邮箱2037730735@qq.com。

二.下载、启动、连接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坐标

<!--导入spring data redis的依赖-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <version>3.2.7</version>
</dependency>

②配置Redis数据源

    此处我的Redis密码是root,这个密码是后来自己设置的,我在前面文章里讲到过这一操作。

    注意:Redis数据库有16个库,分别是DB0 ~ DB15,我们上面指定使用DB0这个库。

如果在yml配置文件中不指定使用哪一个库,则默认使用DB0这个库。

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

3.效果展示

使用ApiFox发送请求:

响应信息: 

        可见此时,确实给用户casually的邮箱2037730735@qq.com发送了6位验证码567801。同时也确实将该验证码存入了redis中, 且过期时间为90秒。

        后续就可以根据redis中存入的验证码,来判断用户前端输入的邮箱验证码是否正确。如果用户输入的验证码和redis中的一致,则说明是本人,就给他修改密码的权限;如果用户输入的验证码和redis中的不一致,则说明不是本人,直接提示错误信息即可。

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

1.问题分析

        上面,我们已经学习了如何向用户的邮箱发送一个6位的验证码,并将该验证码存入了redis中。

        下面,我们就要编写【验证邮箱验证码】的功能了。即:用户在前端输入邮箱验证码,要和redis中的进行对比,如果正确,则通过身份验证;如果不正确,则不通过身份认证。

2.代码

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

}

3.效果展示

五.重置用户的密码

1.问题分析

当用户的验证码输入正确后,则通过身份验证。

下一步就是要修改该用户的密码了。

2.代码

controller层:

//根据用户名,重置用户的密码【找回密码功能】
@PatchMapping("/{username}/updateUserPwdByUserName")
public Result updateUserPwdByUserName(@PathVariable String username, @RequestBody UserDto userDto){
    //预览传来的参数
    /*System.out.println("用户名:" + username + ", 密码:" + userDto.getPassword());*/
    int i = userService.updateUserPwdByUserName(username, userDto);
    if(i > 0){
        return new Result(200, "重置成功");
    }else{
        return new Result(400, "重置失败");
    }

}

service层

//根据用户名,重置用户的密码【找回密码功能】
public int updateUserPwdByUserName(String username, UserDto userDto);

serviceImpl层

//根据用户名,重置用户的密码【找回密码功能】
public int updateUserPwdByUserName(String username, UserDto userDto){
    //先将用户的明文密码加密,在传入mapper层,存入数据库
    String encodedPassword = passwordEncoder.encode(userDto.getPassword());
    int i = userMapper.updateUserPwdByUserName(username, encodedPassword);
    return i;
}

mapper层

//根据用户名,重置用户的密码【找回密码功能】
@Update("update user set password = #{encodedPassword} where username = #{username} ")
public int updateUserPwdByUserName(String username, String encodedPassword);

3.效果展示

 

六.编写前端页面

        由于本篇文章主要学习如何在后端发送邮箱验证码,因此前端的代码我们就不展示了。直接展示页面即可。

1.点击【忘记密码】,跳转到找回密码页面

跳转到了找回密码的界面。

2.输入用户名、邮箱,点击【发送验证码】

注:点击【发送验证码】按钮,请求的是【三】中的那个后端接口。

3.邮箱接收到验证码后,将其填写到输入框中,然后点击【提交】按钮

注:点击【提交】按钮,请求的是【四】中的那个后端接口。

输入验证码后,点击【提交】按钮,会显示身份验证通过。

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

 注:点击【重置】按钮,请求的是【五】中的那个后端接口。

点击重置:

可见,重置密码成功后,几秒后就返回了登录页面,此时我们就可以根据新密码进行登录操作了。

结语

        本篇文章,核心点是学会使用JavaMailSender 给某个邮箱发送验证码(邮件)。其次,要重点掌握redis的基本使用。

        然后,就是考验我们springboot的基本使用是否熟练了,以及是否会使用ApiFox模拟前端向后端发送请求。

        最后,就是我们的前端(特指vue、elelment-plus组件库等)是否熟练操作。

以上就是Java集成【邮箱验证找回密码】功能的详细过程。

喜欢本篇文章的话,可以留个免费的关注呦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值