温馨提示:
如果感觉本文章困难,请移步简单的邮箱验证,不涉及数据库和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-8server.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,添加代码】@Autowiredprivate JavaMailSender mailSender;@AutowiredRedisTemplate<String, String> redisTemplate;
--------------------------发送邮件-------------------------------------------------
@Overridepublic 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();}
@Overridepublic 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私密数据也需要更换成自己的。

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

  1. 五子棋java百度文库_JAVA课程设计 五子棋(内附完整代码).doc

    JAVA课程设计 五子棋(内附完整代码) JAVA课程设计 设计题目:五子棋游戏 简要的介绍五子棋 五子棋的起源 五子棋,又被称为"连五子.五子连.串珠.五目.五目碰.五格.五石.五法.五联 ...

  2. Java发送QQ邮件问题Could not connect to SMTP host: smtp.qq.com, port: 465(内附完整代码)

    邮件发送失败,本地测试可以,部署到服务器就不行. 之前就碰到这个问题,解决办法就是把port端口改成587,然后注释这一段 MailSSLSocketFactory sf = new MailSSLS ...

  3. [内附完整源码和文档] 基于Java的学生学籍管理系统

    摘 要 学生学籍管理系统是一个教育单位不可缺少的重要部分之一,学生学籍内容对学校的管理者和决策者来说都是至关重要的,而传统的学籍管理方式十分的复杂繁琐.低效率,在计算机普及的现代,开发一个高效简便学生 ...

  4. Java学习路线图,内附完整Java自学视频教程+工具经验

    Java学习路线图更新日志:         增加视频<2016最新视频struts2> 密码:vhfp(2016.11.10) 增加视频<6天玩转mysql视频> 密码:a8 ...

  5. [内附完整源码和文档] 基于JAVA的网吧机房管理系统

    摘 要 随着互联网的发展,Internet真正各行各业形成新的热点和经济增长点,网络正在把人们紧密地连接在一起.很难想象在信息时代人们离开网络要怎么生活,工作.因此人们居住环境的信息化,网络化是发展的 ...

  6. [内附完整源码和文档] 基于JAVA的合同管理系统

    摘 要 在当今社会的飞速发展,无数的公司和企业诞生,随之也有着大量员工的产生,公司与员工通过合同连接起来.信息化的发展,使得合同管理有了新的高效管理方式的可能. 企业合同管理是市场经济条件下企业经营管 ...

  7. php 短信验证码30分钟,php下发短信验证码60秒简单验证

    下发短信验证码,除了注册就是验证手机号 简单实现原理就是 用手机号和一个键作为key存到缓存里, 用户请求的时候,验证这个手机号是不是已经申请过key*(即已手机号为缓存的key有没有,)如果有,并且 ...

  8. Java通过QQ群的API读取群组状态的代码

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 有好多群 ...

  9. [内附完整源码和文档] 基于Java的个人通讯录管理系统

    摘 要 随着社会的发展,人际关系变得越来越重要,为了保持良好的人际关系,必须常与亲戚朋友,同学同事保持联系,但有时候存在许多限制条件,因此我们需要为了快速查找联系人的信息,节省查找时间,开发通讯录管理 ...

最新文章

  1. redis完整笔记总结-数据类型-事务与锁-集群-分布式锁-常见问题(缓存穿透、击穿、雪崩)
  2. springmvc学习(小知识点整理)
  3. csapp:无符号数可能造成的程序bug
  4. [Python语音识别项目笔记] 2矩阵标准化和去标准化
  5. php 视图层smarty,4. 视图引擎 View Engine - Smarty
  6. 黑客攻防技术宝典Web实战篇第2版—第4章 解析应用程序
  7. 华中农业大学C语言实验5答案,物理实验报告册(上册)-华中农业大学实验.pdf
  8. error:cv_bridge---opencv和ros连接起来的桥
  9. React Router最新指南与异步加载实践
  10. 搜索引擎四:CoreSeek配置MySql数据源
  11. UnicodeDecodeError: ‘gb2312‘ codec can‘t decode byte 0xe9 in position 5632: illegal multibyte sequen
  12. 发布订阅模式(一):tiny-emitter
  13. python 变量后加逗号的含义
  14. 基于ASP的房屋租售信息管理系统的设计与实现
  15. Java_Map_Map详解
  16. Win7 任务栏上程序名称修改问题
  17. spring5之AOP
  18. 学习游戏模型3d角色,出来好找工作吗?
  19. Python学习笔记(一)数据类型
  20. shell脚本生成双色球号码

热门文章

  1. vue-i18n及ElementUI国际化配置步骤
  2. R语言医学实例分析:代码解析
  3. hypermesh生成MNF柔性体
  4. 富文本编辑器Ueditor实战(二)-图片上传
  5. 沐风老师ATilesPro for 3dMax屋顶设计插件使用教程
  6. 根据当前日期获取本周、本月、本季度相关日期
  7. 发光二极管二极管引脚_LCD? 发光二极管? 等离子体? HDTV技术入门指南
  8. 【转】欧盟物联网研究战略路线图(4)
  9. 调焦后焦实现不同距离成像_调焦与焦距的关系
  10. 数据基础---数据可视化