问题描述

登录不一定要使用账号和密码,有时候会使用手机验证码登录,而手机验证码登录需要花钱进行申请阿里云手机验证,所以我这里就是使用qq邮箱发送验证码(免费)来替换手机验证码登录,开发真实环境还是使用手机验证码登录,这里适合个人练习使用。


解决方案:

首先要使用qq邮箱,当然要拿到你的qq邮箱的SMTP的密码

这里演示为例:

打开qq邮箱

点击上面我标的红线,然后向下拉点击开启SMTP服务

按照它的步骤会得到对应的SMTP的密码,后面我们会使用到

代码部分:

步骤1、导入依赖

<!--邮箱验证登录导入的依赖--><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-email</artifactId><version>1.4</version></dependency><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.1</version></dependency>

步骤2、导入两个我们要使用的工具类

第一个工具类是生成对应的验证码就是几位数字

import java.util.Random;/*** 随机生成验证码工具类*/
public class ValidateCodeUtils {/*** 随机生成验证码* @param length 长度为4位或者6位* @return*/public static Integer generateValidateCode(int length){Integer code =null;if(length == 4){code = new Random().nextInt(9999);//生成随机数,最大为9999if(code < 1000){code = code + 1000;//保证随机数为4位数字}}else if(length == 6){code = new Random().nextInt(999999);//生成随机数,最大为999999if(code < 100000){code = code + 100000;//保证随机数为6位数字}}else{throw new RuntimeException("只能生成4位或6位数字验证码");}return code;}/*** 随机生成指定长度字符串验证码* @param length 长度* @return*/public static String generateValidateCode4String(int length){Random rdm = new Random();String hash1 = Integer.toHexString(rdm.nextInt());String capstr = hash1.substring(0, length);return capstr;}
}

第二个工具类是邮箱对应发送信息使用的,参数1: 发送的邮箱,就是登录时你填的邮箱,参数2: 填写第一个工具类的随机生成的验证码

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;/*** @author mrs* @create 2022-06-06 0:26*/public class EmailUtil {public static void sendAuthCodeEmail(String email, String authCode) {try {SimpleEmail mail = new SimpleEmail();mail.setHostName("smtp.qq.com");//发送邮件的服务器,这个是qq邮箱的,不用修改mail.setAuthentication("139@qq.com", "SMTP的密码");//第一个参数是对应的邮箱用户名一般就是自己的邮箱第二个参数就是SMTP的密码,我们上面获取过了mail.setFrom("139@qq.com","mrs");  //发送邮件的邮箱和发件人mail.setSSLOnConnect(true); //使用安全链接mail.addTo(email);//接收的邮箱mail.setSubject("验证码");//设置邮件的主题mail.setMsg("尊敬的用户:你好!\n 登陆验证码为:" + authCode+"\n"+"     (有效期为一分钟)");//设置邮件的内容mail.send();//发送} catch (EmailException e) {e.printStackTrace();}}
}

对应的Springboot中的Controller层的代码,仅供参考,具体问题自己解决,这是交互层了,看自己的水平了,我这里使用的是前端vue,直接接收json数据了。

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ma.reggie.common.R;
import com.ma.reggie.entity.User;
import com.ma.reggie.service.UserService;
import com.ma.reggie.utils.EmailUtil;
import com.ma.reggie.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
import java.util.Map;/*** @author mrs* @create 2022-06-05 23:46*/
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;/*** 发送qq邮箱验证码短信* @param user* @return*/@PostMapping("/sendMsg")public R<String> sendMsg(@RequestBody User user, HttpSession session){//获取邮箱String phone = user.getPhone();if(StringUtils.isNotEmpty(phone)){//生成随机的4位验证码String code = ValidateCodeUtils.generateValidateCode(4).toString();log.info("code={}",code);//调用自己封装的qq邮箱发送器发送邮箱EmailUtil.sendAuthCodeEmail(phone,code);//需要将验证码保存到session中session.setAttribute(phone,code);
//            session.setMaxInactiveInterval(60); //设置session有效期 60秒,这里以后可能会用redis,所以先不设置!return R.success("邮箱验证码发送成功");}return R.error("邮箱发送失败");}/*** 移动端用户登录* 这里的接收参数是phone和code,一般肯定单独创建一个dto来接收,这里直接其实使用map也可以* @param map* @param session* @return*/@PostMapping("/login")public R<User> login(@RequestBody Map map, HttpSession session){log.info(map.toString());//获取邮箱String phone = map.get("phone").toString();//获取验证码String code = map.get("code").toString();//从Session中获取保存的验证码Object codeInSession = session.getAttribute(phone);//进行验证码的比对(页面提交的验证码和Session中保存的验证码比对)if(codeInSession!=null&&codeInSession.equals(code)){//如果能够比对成功,说明登录成功//判断当前手机号对应的用户是否为新用户,如果是新用户就自动完成注册LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(User::getPhone,phone);User user = userService.getOne(queryWrapper);if(user==null){//说明是新用户//直接注册user = new User();user.setPhone(phone);user.setStatus(1);userService.save(user);}//登录成功,放入对应的用户session数据并返回对应用户的信息session.setAttribute("user",user.getId());log.info("user:::{}",user.getId());return R.success(user);}return R.error("登录失败");}
}

补充:这里没有使用redis做缓存,适合初学者使用,如果要更好的功能,自己学习redis后做优化即可。

SpringBoot项目实现qq邮箱验证码登录相关推荐

  1. SpringBoot实现发送QQ邮箱验证码

    SpringBoot实现发送QQ邮箱验证码 打开qq邮箱官网 点击设置 找到开启服务:POP3/SMTP 然后复制给的密授权码(记住) 导入maven依赖坐标 <!--qq邮箱--> &l ...

  2. 【工作记录】springboot项目通过qq邮箱发送邮件

    邮件是我们项目中经常会用到的功能,比如发送验证码或者发送通知等.springboot也提供了相应的springboot-starter方便开发者使用. 本文就是记录如何使用qq邮箱给指定用户发送邮件, ...

  3. QQ邮箱验证码登录(移动端邮箱验证登录)

    获取邮箱授权码 登录邮箱------->点击设置------->点击账户,下拉------->找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务-- ...

  4. mysql查询使用qq邮箱注册_Spring Boot实现qq邮箱验证码注册和登录验证功能

    1.登录注册思路 这是一个使用spring boot做的一个qq邮箱注册和登录的项目. 没写前端页面,使用postman测试.有截图详细. 1.1.思路 注册:通过输入的邮箱发送验证码,检验前端传来的 ...

  5. springboot项目系列-论坛系统04登录注册实现

    springboot项目系列-论坛系统04登录注册实现 论坛地址:http://www.cywloveyou.top 注册(使用AJAX,邮件任务,RabbitMQ) 首先跳转到注册页面,进行注册,跳 ...

  6. C# WinForm 使用SMTP协议发送QQ邮箱验证码

    文章目录 前言 功能实现步骤 一.获取QQ邮箱授权码 二.功能界面 三.创建发送邮箱验证码的类 四.在From1中调用类中的函数,实现功能 前言   在程序设计中,发送验证码是常见的一个功能,用户在注 ...

  7. Java+Selenium实现QQ邮箱自动登录、发邮件与退出

    初学selenium,用最近所学知识写了QQ邮箱自动登录.发送邮件.退出,算是对自己学习的知识的巩固吧.如果哪里有不足之处,就请各位告诉我,指导我一下,非常感谢. 登录页面 在网页登录QQ邮箱的时候, ...

  8. QQ空间及邮箱验证码登录的校验方式及自动登录的解决方案

    目前有很多的SNS社区或类SNS的网站,例如开心.51.校内等,但是发现大多数社区在邀请好友的时候都没有提供对QQ邮箱或者QQ空间好友列表获取的功能,不过似乎海内支持,但是网上相关QQ的文章还不是很多 ...

  9. 登录系统-发送QQ邮箱验证码(2)

    在网上找了很久的QT基于smtp的发送邮件,最后找到了一个别人写的,可以用.下面是链接: https://download.csdn.net/download/weixin_39566101/1063 ...

  10. java发送QQ邮箱验证码实现登录注册、邮箱验证码防刷校验

    文章目录 一:前台功能实现 1.1 页面编写 1.2 发送验证码--sendEmailCode 1.2.1 远程调用发送接口 1.2.1 接口防刷校验--60s内只能发送一次 二:获取QQ邮箱授权码 ...

最新文章

  1. [Java] 字符串
  2. innodb和my查询速度_mysql存储引擎MyISAM和InnoDB
  3. 如果在iTerm2中复制命令特别卡,就跟慢动作似的,怎么办?
  4. php 游标 上移,jQuery点击input使光标移动到最后或指定位置
  5. 03_MySQL多表事务课堂笔记
  6. python get_len_Python类,特殊方法, __getitem__,__len__, __delitem__
  7. Unity 4 3 制作一个2D横版射击游戏 2
  8. 上海东海学院计算机,上海东海职业技术学院
  9. AJAX 带有 取消功能的 UpdateProgress
  10. C语言小案例——万年历制作
  11. 【天锐绿盾】2022年代理商技术认证培训考核试卷(A卷)
  12. android 移动网络定位服务器地址,安卓定位方式全总结-gps定位,network定位,ip定位,基站定位...
  13. android lame,Android 采用Lame编码器编码mp3文件
  14. 演示固态硬盘装win11系统教程
  15. Dubbo配置加载问题
  16. 今日头条怎么做发布,如何用今日头条号进行宣传推广?
  17. matlab cdf 曲线不平滑,拟合经验CDF曲线以找到确切的值
  18. htc legend 升级到 android 2.2 froyo 后,输入法问题
  19. sourcetree出现提交成功但推送失败的问题
  20. 杂谈之Java命名规范与注释

热门文章

  1. android 标签云圆形,JavaScript实现的圆形浮动标签云效果实例
  2. 如何去做一个完整的网站SEO优化方案!
  3. WeWork中国实现全面本土化运营;巴黎欧莱雅沙龙专属全球首家旗舰沙龙开业 | 美通企业日报...
  4. 红外额温枪方案(包含原理图和PCB文件)
  5. C6678多核DSP——CMD文件介绍
  6. 【HTML5】input标签中的Require必填项
  7. 学校计算机机房维护年度总结,学校计算机机房的管理和维护建议原稿(全文完整版)...
  8. python开发桌面软件实例-Python开发的第一步:利用Python开发一个桌面小程序
  9. 如何对全站进行死链接检测?
  10. python 极客学院 正则表达式