最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot項目接入第三方qq郵箱驗證登錄的全過程

 更新時間:2024年04月30日 08:24:42   作者:樹若逝花若殤  
互聯(lián)網(wǎng)發(fā)展到現(xiàn)在,相必大家都知道發(fā)送郵件應該是網(wǎng)站的必備功能之一,下面這篇文章主要給大家介紹了關于springboot項目接入第三方qq郵箱驗證登錄的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言:

本次項目基于springboot 3.x 

jdk為17

Maven版本為:3.8.1 

IDEA版本為:2023.3.x

1、在qq郵箱進行相關的設置

第一步:我們進入qq郵箱的右上角有一個賬號與安全設置:我們點進去

第二步:點進去后來到這個頁面:選擇安全設置,在最下面有這個服務,我們需要開啟這個服務,然后生成一個授權(quán)碼,生成的授權(quán)碼記得保存下來,這個很有用處

2、編寫java代碼

緊接著在我們的項目工程中就可以編寫java代碼了

2.1、首先我們先引入相關的maven依賴包

首先在我們的pom.xml文件中引入關于email的依賴包

 <!--        email郵箱驗證-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

2.2、隨后配置yml文件,進行相關的配置

spring:
  mail:
   host: smtp.qq.com # 指定郵件服務器的主機名,這里默認是smtp.qq.com,表示使用的是騰訊的SMTP服務器。
   port: 587 # 456也行
   username: "你的email" # xxxx@qq.com  這里是發(fā)送者
   password: "授權(quán)碼"  # 這里就是我前面提到的授權(quán)碼了
   properties:   # 其他配置
     mail:
       smtp:
         socketFactoryClass: javax.net.ssl.SSLSocketFactory # 指定SSL Socket工廠類,用于創(chuàng)建加密的郵件連接。
         auto: true # 設置為true表示啟用自動連接。
       starttls: # 配置STARTTLS加密連接
         enable: true # 設置為true表示啟用STARTTLS。
         required: true # 設置為true表示STARTTLS是必需的,如果不可用,則會拋出異常。
   default-encoding: UTF-8 # 設置郵件內(nèi)容的默認編碼格式為UTF-8 默認就是UTF-8

上面就是配置基本信息了,根據(jù)你的需求可以自行更改

2.3、創(chuàng)建Email工具類

我們需要將業(yè)務代碼整合到一個工具類(EmailSendUtils )中進行編碼,我們創(chuàng)建一個專門用于發(fā)送email郵箱驗證碼的類,里面涵蓋了發(fā)送的步驟,以及隨機生成6位字母和數(shù)字的驗證碼。

上代碼:

package com.sxy.recordnetwork.Utils;

import com.sxy.recordnetwork.enumeration.Constants;
import org.aspectj.apache.bcel.classfile.Code;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import javax.swing.*;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

/**
 * 發(fā)送郵箱驗證碼工具類
 * Created by sxy on 2024/3/11.
 */
@Service
public class EmailSendUtils {
    // 注入JavaMailSender接口
    @Autowired
    private JavaMailSender  mailSender;
    // 集成redis進行驗證碼的緩存
    @Autowired
    private RedisTemplate redisTemplate;

    // 通過value注解得到配置文件中發(fā)送者的郵箱
    @Value("${spring.mail.username}")
    private String userName;// 用戶發(fā)送者

    // 郵箱驗證碼 定義為StringBuilder對于增刪改操作有優(yōu)勢
    private final StringBuilder EMAIL_CODE = new StringBuilder();

    // 創(chuàng)建一個發(fā)送郵箱驗證的方法
    public void sendVerificationEmail(String to){

        try{
            // 定義email信息格式
            SimpleMailMessage message = new SimpleMailMessage();
            // 調(diào)用生成6位數(shù)字和字母的方法,生成驗證碼,該方法在下面定義好了
            generateRandomCode();
            // 設置發(fā)件人
            message.setFrom(userName);
            // 接收者郵箱,為調(diào)用本方法傳入的接收者的郵箱xxx@qq.com
            message.setTo(to);
            // 郵件主題
            message.setSubject(Constants.EMAIL_TITLE.getValue());
            // 郵件內(nèi)容  設置的郵件內(nèi)容,這里我使用了常量類字符串,加上驗證碼,再加上常量類字符串
          message.setText(Constants.EMAIL_MESSAGE.getValue()+EMAIL_CODE+Constants.EMAIL_OUTTIME_TEN.getValue());
            // 開始發(fā)送
            mailSender.send(message);
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            // 發(fā)送完了之后,將EMAIL_CODE設置為空
            EMAIL_CODE.setLength(0);
        }

    }

    /**
     * 隨機生成6位字母加數(shù)字組合的驗證碼
     * @return
     */
    public void generateRandomCode(){
        // 字母和數(shù)字組合
        String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        // 拆分每一個字符放到數(shù)組中
        String[] newStr = str.split("");
        // 循環(huán)隨機生成6為數(shù)字和字母組合
        for (int i = 0; i < 6; i++){
            // 通過循環(huán)6次,為stringBuilder追加內(nèi)容,內(nèi)容為隨機數(shù)?62,取整
            EMAIL_CODE.append(newStr[(int)(Math.random() * 62)]);
        }
        //TODO 這里存儲的key如果多個用戶同時發(fā)送的話會覆蓋key,就會導致第一個人的驗證碼被覆蓋
        // 存入Redis中并設置時長為2分鐘
        redisTemplate.opsForValue().set(Constants.EMAIL_CODE.getValue(), EMAIL_CODE,120, TimeUnit.SECONDS);
    }
}

這里我聲明了一個自定義異常類BaseException去繼承RuntimeException這個類

package com.sxy.recordnetwork.Exception;

public class BaseException extends RuntimeException{

    public BaseException( String msg) {
        super(msg);
    }
}

然后我們再創(chuàng)建驗證碼相關的異常類信息去繼承這個就可以了

package com.sxy.recordnetwork.Exception.Son;

import com.sxy.recordnetwork.Exception.BaseException;

/**
 *  郵箱驗證碼異常
 */
public class EmailCodeException extends BaseException {
    public EmailCodeException(String msg) {
        super(msg);
    }
}

注意:這個地方可以看我往期的文章,有寫全局異常處理器的使用方法

2.4、在Controller層編寫接口調(diào)用sendVerificationEmail接口參數(shù)為接收者郵箱

package com.sxy.recordnetwork.controller;

import com.sxy.recordnetwork.DTO.USER.UserDtoEmailLogin;
import com.sxy.recordnetwork.DTO.USER.UserDtoPhoneLogin;
import com.sxy.recordnetwork.Exception.Son.EmailCodeException;
import com.sxy.recordnetwork.Utils.EmailSendUtils;
import com.sxy.recordnetwork.enumeration.Constants;
import com.sxy.recordnetwork.common.Result;
import com.sxy.recordnetwork.common.SendCode;
import com.sxy.recordnetwork.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.TimeUnit;

/**
 * 第三方短信驗證以及其他相關操作
 */
@RequestMapping("/code")
@RestController
@Slf4j
public class CodeController {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserService userService;
    @Autowired
    private EmailSendUtils emailSendUtils;

    /**
     * 郵箱驗證碼發(fā)送
     * @param receiveEmail
     * @return
     */
    @GetMapping("/email/sendEmail")
    public Result sendSimpleMail(@RequestParam(value = "receiveEmail") String receiveEmail) {
        emailSendUtils.sendVerificationEmail(receiveEmail);
        return Result.success(Constants.EMAIL_SEND_SUCCESS.getValue(),null);
    }

    /**
     * qq郵箱驗證登錄
     * @param emailLogin
     * @return
     */
    @PostMapping("/emailLogin")
    public Result emailLogin(@RequestBody UserDtoEmailLogin emailLogin){
        // 查看是否存在這一個qq郵箱
        if(!userService.getEmail(emailLogin.getEmail())){
            throw new EmailCodeException(Constants.NOT_EXIST_EMAIL.getValue());
        }
        // 從redis數(shù)據(jù)庫中獲取email_code驗證碼用來做判斷
        String email_code = (String) redisTemplate.opsForValue().get(Constants.EMAIL_CODE.getValue());
        if(!emailLogin.getCode().equals(email_code)){
            throw new EmailCodeException(Constants.EMAIL_CODE_ERROR.getValue());
        }
        // 登陸成功 清楚本地redis郵箱驗證碼
        redisTemplate.delete(Constants.EMAIL_CODE.getValue());
        return Result.success(Constants.LOGIN.getValue(),userService.EmailLogin(emailLogin.getEmail()));
    }
}

2.5、聲明的常量類:

因為項目中用到了大量的字符串,所以我這里就寫了常量類,來代替字符串

package com.sxy.recordnetwork.enumeration;

import lombok.Getter;

/**
 * 枚舉類,常量
 */
@Getter
public enum Constants {
    EMAIL_SEND_SUCCESS("皇上,臣妾已為您發(fā)送了郵箱哦!"),//郵件發(fā)送成功,請查收!
    EMAIL_MESSAGE("您的QQ郵箱驗證碼為:"),
    EMAIL_OUTTIME_TEN(",請在2分鐘內(nèi)完成驗證"),
    EMAIL_TITLE("QQ郵箱驗證碼"),// 郵箱驗證碼發(fā)送的標題
    EMAIL_CODE("email_code"),// 郵箱驗證碼redis的key
    EMAIL_CODE_ERROR("皇上,請核實您的QQ郵箱驗證碼是否正確!"),// qq郵箱驗證碼錯誤
    NOT_EXIST_EMAIL("皇上,臣妾沒有找到您的QQ郵箱,請確認是否正確!");// 郵箱不存在

    private final String Value;

    Constants(String value){
        this.Value = value;
    }
}

好了,到這里就結(jié)束了,這樣的話一個qq郵箱驗證碼就通過發(fā)送了

總結(jié)

到此這篇關于springboot項目接入第三方qq郵箱驗證登錄的文章就介紹到這了,更多相關springboot接入qq郵箱驗證登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

德江县| 澜沧| 泾阳县| 琼海市| 延边| 望谟县| 蛟河市| 浦城县| 镇宁| 奉贤区| 临颍县| 安塞县| 垣曲县| 桦甸市| 昌图县| 谷城县| 舞阳县| 舞钢市| 桐城市| 本溪市| 兰坪| 桃园市| 博客| 沽源县| 措勤县| 天全县| 三门峡市| 扶绥县| 封丘县| 灌南县| 开鲁县| 阿克| 微博| 来凤县| 固安县| 谢通门县| 道孚县| 武汉市| 井陉县| 定西市| 吉首市|