Java实现QQ邮箱登录,实现邮箱验证码三分钟失效,代码实现发送验证码和登录全过程思路。内附完整项目。

温馨提示:
如果感觉本文章困难,请移步简单的邮箱验证,不涉及数据库和Redis,点击我进行跳转
使用技术:
1. MySQL数据库
2. Redis缓存(极其简单)点击此处学习
功能介绍:

  1. 发送验证码到QQ邮箱,验证码存到Redis中三分组有效,到时间自动清理
  2. 登录时返回结果,密码不添加表格展示了,密码不正确提示密码不正确
输入邮箱输入验证码返回提示
正确、不正确没输入验证码不能为空
不正确输入邮箱未注册
正确输入错误验证码不对哦
正确输入过期的验证码失效了哦,请重新获取
不正确没输入邮箱未注册
正确输入不过期正确登录成功了
  1. 详细思路在代码的注释里面。一步一个注释哦。

项目总览
数据库:
在这里插入图片描述
在这里插入图片描述

项目:
在这里插入图片描述

实现过程
4. 引入依赖

<!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <!--Redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--redis-->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.22</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>2.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
  1. 配置项目
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/email_test?serverTimezone=UTC?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

#邮箱配置
#平台地址,这里用的是qq邮箱,使用其他邮箱请更换
spring.mail.host = smtp.qq.com
#改成自己的邮箱
spring.mail.username = xxxxx@qq.com
#发送短信后它给你的授权码 填写到这里
spring.mail.password = xxxxxx
#这东西不用改
spring.mail.properties.mail.smtp.ssl.enable=true
##编码格式
spring.mail.default-encoding=UTF-8

server.port=7002
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000ms
  1. 关键代码
【遇到缺失Redis和mailSender,添加代码】
 	@Autowired
    private JavaMailSender mailSender;
    @Autowired
    RedisTemplate<String, String> redisTemplate;
--------------------------发送邮件-------------------------------------------------
@Override
    public Map<String, Object> send(UserInfo userInfo) {
        Map<String, Object> map=new HashMap<>();
        /**
         *  前提:
         *      为了区分验证码是属于谁发送的,发送验证码时需要提交邮箱
         *      参数:email 邮箱       code 验证码
         */
        //判断是否提交了邮箱
       if (StringUtils.isEmpty(userInfo.getEmail())){
           map.put("date","null");
           map.put("msg","请提交账号");
           return map;
       }
        String code;
        //发送邮箱验证码
        try {
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            //主题
            mailMessage.setSubject("验证码邮件");
            //生成随机数
            code = randomCode();
            //内容
            mailMessage.setText("您收到的验证码是:" + code);
            //发给谁
            mailMessage.setTo(userInfo.getEmail());
            //你自己的邮箱(可以去配置文件中获取)当前写死
            mailMessage.setFrom("xxxxxxxx@qq.com");
            //发送
            mailSender.send(mailMessage);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("date",null);
            map.put("msg","数据异常啦");
            return map;
        }
        //如果成功把手机号和验证码放到redis中保存
        //设置key,value,过期时间,时间单位
        //时间单位为 TimeUnit.MINUTES  两分钟,TimeUnit可以决定单位
        redisTemplate.opsForValue().set(userInfo.getEmail(), code, 2, TimeUnit.MINUTES);
        map.put("code",code);
        map.put("msg","发送成功");
        return map;
    }
    /**
     * 随机生成6位数的虚拟银行卡
     * @return String code
     */
    public String randomCode(){
        StringBuilder str = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            str.append(random.nextInt(10));
        }
        return str.toString();
    }
@Override
    public Map<String, Object> login(UserInfo userInfo) {
        Map<String, Object> map=new HashMap<>();
        if (StringUtils.isEmpty(userInfo.getCode())){
            //没输入验证码
            map.put("date",null);
            map.put("msg","验证码不能为空");
            return map;
        }
        //首先判断邮箱是否存在
        UserInfo userInfoDB = baseMapper.selectOne(Wrappers.<UserInfo>lambdaQuery().eq(UserInfo::getEmail, userInfo.getEmail()));
        //判断该邮箱是否存在
        if (userInfoDB==null){
            //不存在,返回
            map.put("date",null);
            map.put("msg","该邮箱还未注册");
            return map;
        }
        //存在,去缓存中获取验证码
        String redisCode = redisTemplate.opsForValue().get(userInfo.getEmail());
        if (StringUtils.isEmpty(redisCode)){
            map.put("date",null);
            map.put("msg","验证码失效了哦,请重新获取");
            return map;
        }
        //验证验证码是否正确
        if (redisCode.equals(userInfo.getCode())){
            //正确,直接登录
            map.put("date",userInfoDB);
            map.put("msg","登录成功了");
            return map;
        }else {
            //不正确
            map.put("date","null");
            map.put("msg","验证码不对哦");
            return map;
        }
    }
  1. 测试结果(验证码过期测试),其他测试不展示
    在这里插入图片描述

  2. 项目链接
    在这里插入图片描述
    数据库单表只有这几个字段,自行创建吧
    项目链接

8. 提示:
需要修改的地方大概有,配置文件(数据库账号密码。数据库名称,QQ邮箱配置),代码里面一些xxxxx私密数据也需要更换成自己的。

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XuDream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值