600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Java实现QQ邮箱登录 实现邮箱验证码三分钟失效 代码实现发送验证码和登录全过程思路

Java实现QQ邮箱登录 实现邮箱验证码三分钟失效 代码实现发送验证码和登录全过程思路

时间:2022-06-03 23:24:10

相关推荐

Java实现QQ邮箱登录 实现邮箱验证码三分钟失效 代码实现发送验证码和登录全过程思路

温馨提示:

如果感觉本文章困难,请移步简单的邮箱验证,不涉及数据库和Redis,点击我进行跳转

使用技术:

1. MySQL数据库

2. Redis缓存(极其简单)点击此处学习

功能介绍:

发送验证码到QQ邮箱,验证码存到Redis中三分组有效,到时间自动清理登录时返回结果,密码不添加表格展示了,密码不正确提示密码不正确详细思路在代码的注释里面。一步一个注释哦。

项目总览

数据库:

项目:

实现过程

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>

配置项目

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/email_test?serverTimezone=UTC?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghaispring.datasource.username=rootspring.datasource.password=root#邮箱配置#平台地址,这里用的是qq邮箱,使用其他邮箱请更换spring.mail.host = #改成自己的邮箱spring.mail.username = xxxxx@#发送短信后它给你的授权码 填写到这里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

关键代码

【遇到缺失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@");//发送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;}}

测试结果(验证码过期测试),其他测试不展示

项目链接

数据库单表只有这几个字段,自行创建吧

项目链接

8. 提示:

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。