SpringBoot项目实现qq邮箱验证码登录

问题描述

登录不一定要使用账号和密码,有时候会使用手机验证码登录,而手机验证码登录需要花钱进行申请阿里云手机验证,所以我这里就是使用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后做优化即可。

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
下面是一个简单的Spring Boot邮箱验证码注册登录实现示例: 1. 引入依赖 在pom.xml中加入以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 配置邮箱信息 在application.properties或application.yml文件中添加邮件相关配置信息: ```properties # 邮箱服务器地址 spring.mail.host=smtp.qq.com # 邮箱服务器端口 spring.mail.port=587 # 邮箱账号 spring.mail.username=your_email@qq.com # 邮箱授权码,非邮箱密码 spring.mail.password=your_email_password # 是否启用ssl spring.mail.properties.mail.smtp.starttls.enable=true ``` 3. 编写注册登录接口 编写一个简单的RestController类,包含以下接口: - 发送验证码接口:根据邮箱地址发送验证码。 - 注册接口:根据邮箱地址和验证码进行注册。 - 登录接口:根据邮箱地址和密码进行登录。 ```java @RestController public class UserController { @Autowired private JavaMailSender mailSender; // 发送验证码接口 @PostMapping("/sendCode") public String sendCode(@RequestParam String email) { String code = generateCode(); // 发送邮件 SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("your_email@qq.com"); message.setTo(email); message.setSubject("验证码"); message.setText("您的验证码是:" + code); mailSender.send(message); return code; } // 注册接口 @PostMapping("/register") public String register(@RequestParam String email, @RequestParam String code) { // 校验验证码 // 根据邮箱验证码进行注册 return "注册成功"; } // 登录接口 @PostMapping("/login") public String login(@RequestParam String email, @RequestParam String password) { // 根据邮箱和密码进行登录 return "登录成功"; } // 生成随机验证码 private String generateCode() { String codeChars = "0123456789"; StringBuilder sb = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 6; i++) { int index = random.nextInt(codeChars.length()); sb.append(codeChars.charAt(index)); } return sb.toString(); } } ``` 4. 测试接口 使用Postman等工具测试上述接口。例如: - 发送验证码接口:POST http://localhost:8080/sendCode?email=your_email@qq.com - 注册接口:POST http://localhost:8080/register?email=your_email@qq.com&code=123456 - 登录接口:POST http://localhost:8080/login?email=your_email@qq.com&password=your_password 以上示例仅为参考,实际应用中还需要进行参数校验、异常处理等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值