SpringBoot项目实现qq邮箱验证码登录
适合代替手机验证码登录的qq邮箱验证码技术,基于Springboot和vue实现
·
问题描述
登录不一定要使用账号和密码,有时候会使用手机验证码登录,而手机验证码登录需要花钱进行申请阿里云手机验证,所以我这里就是使用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);//生成随机数,最大为9999 if(code < 1000){ code = code + 1000;//保证随机数为4位数字 } }else if(length == 6){ code = new Random().nextInt(999999);//生成随机数,最大为999999 if(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 { @Autowired private 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后做优化即可。
更多推荐
已为社区贡献1条内容
所有评论(0)