欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊功能

 更新時(shí)間:2020年02月12日 14:18:51   作者:ForLevin  
這篇文章主要為大家詳細(xì)介紹了SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊功能實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文為大家分享了SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊功能實(shí)例,供大家參考,具體內(nèi)容如下

這里有兩種方式:
使用Apache Common包中開源的email組件,通過實(shí)例化HtmlEmail()對象,可通過配置外置字典、或yml等配置文件實(shí)現(xiàn)靈活配置;

依賴:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-email</artifactId>
  <version>1.5</version>
</dependency>

使用SpringBoot Starter email組件;

依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

我這里是采用的第一種方式,簡單易懂;

首先需要配置Email的各項(xiàng)參數(shù),其中hostname、host、username、passsword(注意:此處的密碼并不是登錄的密碼,而是郵箱開啟smtp服務(wù)的令牌);
我這里使用SpringBoot的yml配置文件,可以通過切換不同的環(huán)境:local/dev/test/pro/prod等等環(huán)境實(shí)現(xiàn)靈活配置,該配置為自定義配置;

我此處使用的是本人的163郵箱,在實(shí)際開發(fā)中需要換為公司的或項(xiàng)目專用郵箱;
(注意:此種方式有缺陷,即為不能從外部進(jìn)行靈活配置,只能寫死配置文件,在實(shí)際使用上應(yīng)該配置為數(shù)據(jù)字典,可以在外部直接進(jìn)行靈活配置)

yml:

##Email配置
email:
 host-name: smtp.163.com #服務(wù)地址,可以直接在web端登錄,找到smtp服務(wù)看到,163郵箱默認(rèn)開放25端口,可暫時(shí)不設(shè)置
 authentication:
  username: xxx.163.com
  password: xxx #手動(dòng)的設(shè)置令牌
 form:
  mail: xxx@163.com #發(fā)送方,必須為你設(shè)置的username一致
  name: elog #發(fā)送方顯示的名稱,可以隨意設(shè)置
 charset: UTF-8 #編碼格式,一般設(shè)置為UTF-8

util:

package com.hisw.rest.utils;

import com.hisw.common.exception.RRException;
import org.apache.commons.mail.HtmlEmail;
/**
 * @ClassName EmailCodeUtils
 * @Description TODO 郵箱驗(yàn)證碼工具類
 * @Author liwenju
 * @Date 2019/5/15 14:20
 * @Version 1.0
 **/
public class EmailCodeUtils {

  /**
   * 生成6位隨機(jī)驗(yàn)證碼
   * @return
   */
  public static String getNumber(){
    String str = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String code = "";
    for(int i= 0;i<6;i++){
      int index = (int)(Math.random()*str.length());
      code+=str.charAt(index);
    }
    return code;
  }

  /**
   * 發(fā)送郵箱驗(yàn)證碼
   * @param receiverEmail
   * @param subject
   * @param msg
   */
  public static void sendEmailCode(String EMAIL_HOST_NAME,String EMAIL_FORM_MAIL,
               String EMAIL_FORM_NAME,String EMAIL_AUTHENTICATION_USERNAME,
               String EMAIL_AUTHENTICATION_PASSWORD,String receiverEmail,
               String subject,String msg){
    try{
      HtmlEmail email = new HtmlEmail();
      email.setHostName(EMAIL_HOST_NAME);
      email.setCharset("utf-8");
      email.setFrom(EMAIL_FORM_MAIL,EMAIL_FORM_NAME);
      email.setAuthentication(EMAIL_AUTHENTICATION_USERNAME,EMAIL_AUTHENTICATION_PASSWORD);
      email.addTo(receiverEmail);
      email.setSubject(subject);
      email.setMsg(msg);
      email.send();
    }catch (Exception ex){
      throw new Exception("發(fā)送驗(yàn)證碼失敗,原因:"+ex.getMessage());
    }
  }

}

注意:在靜態(tài)工具類的方法中,不可直接調(diào)用@Value(value="$xxx")來獲取yml的配置文件的參數(shù)值,否則會(huì)獲取不到值。故不在該util類中直獲取。如下所示:

/**
 * 獲取郵箱配置
 */
@Value(value = "${email.host-name}")
public String EMAIL_HOST_NAME;

方法示例:

/**
 * 獲取郵箱配置
 */
@Value(value = "${email.host-name}")
public String EMAIL_HOST_NAME;

@Value(value = "${email.authentication.username}")
public String EMAIL_AUTHENTICATION_USERNAME;

@Value(value = "${email.authentication.password}")
public String EMAIL_AUTHENTICATION_PASSWORD;

@Value(value = "${email.charset}")
public String EMAIL_CHARSET;

@Value(value = "${email.form.mail}")
public String EMAIL_FORM_MAIL;

@Value(value = "${email.form.name}")
public String EMAIL_FORM_NAME;

@Autowired
private SysUserDao sysUserDao;

@Autowired
private SysUserTokenDao sysUserTokenDao;

@Autowired
private RedisUtils redisUtils;

private Logger logger = LoggerFactory.getLogger(LoginUserServiceImpl.class);
/**
 * 驗(yàn)證碼過期時(shí)間60s
 */
private Integer redisExpire = 60 * 1000;

/***
 * 根據(jù)郵箱驗(yàn)證用戶
 * @param account
 * @return
 */
public SysUserEntity queryByEmail(String account){
  SysUserEntity sysUserEntity = new SysUserEntity();
  sysUserEntity.setEmail(account);
  return sysUserDao.selectOne(sysUserEntity);
}

/**
 * 判斷該郵箱是否已存在
 * @param email
 * @return
 */
public Boolean checkEmail(String email){
  //首先判斷該用戶是否已存在
  if (StringUtils.isNotEmpty(email)){
    EntityWrapper<SysUserEntity> userEntityWrapper = new EntityWrapper<>();
    userEntityWrapper.eq("email",email);
    List<SysUserEntity> sysUserList = sysUserDao.selectList(userEntityWrapper);
    //如果已存在該用戶
    return sysUserList.size() <= 0;
  }
  return true;
}

/**
 *發(fā)送郵箱驗(yàn)證碼
 *
 */
public R sendRegisterEmailCode(String email) {
  try {
    //驗(yàn)證郵箱規(guī)則
    if (!RegexUtils.checkEmail(email)){
      throw new RRException("The mailbox does not conform to the specification!");
    }
    if (!checkEmail(email)){
      throw new RRException("This mailbox already exists. Please change the user's email and try again!");
    }
    String emailCode = EmailCodeUtils.getNumber();
    //發(fā)送驗(yàn)證碼
    EmailCodeUtils.sendEmailCode(EMAIL_HOST_NAME, EMAIL_FORM_MAIL,
        EMAIL_FORM_NAME, EMAIL_AUTHENTICATION_USERNAME,
        EMAIL_AUTHENTICATION_PASSWORD, email, EmailTextTemplate.REGISTER_SUBJECT,
        EmailTextTemplate.REGISTER_CONTENT + emailCode + EmailTextTemplate.CONTENT_SUFFIX);
    logger.info("驗(yàn)證碼發(fā)送成功:{}", email);
    //發(fā)送成功,將該驗(yàn)證碼按照規(guī)定格式放入redis
    redisUtils.set(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY + email, emailCode, redisExpire);
    logger.info("Redis存儲(chǔ)驗(yàn)證碼成功:{}", emailCode);
    return R.ok("The verification code has been sent to your mailbox and is valid for 60 seconds.");
  } catch (Exception ex) {
    return R.error(ex.getMessage());
  }
}


/**
 *驗(yàn)證驗(yàn)證碼
 /
 public R checkRegisterEmailCode(String email, String code) {
  try {
    String redisCode = redisUtils.get(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY+email);
    //判斷是否已過期
    if (StringUtils.isEmpty(redisCode)){
      return R.error("The E-mail verification code has expired, please try again.");
    }
    //判斷驗(yàn)證碼是否正確
    if (!StringUtils.equals(redisCode,code)){
      return R.error("The E-mail verification code is wrong. Please try again.");
    }
    //驗(yàn)證成功,從redis中移除該key&value
    redisUtils.delete(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY+email);
    return R.ok("The E-mail verification code has been verified.");
  }catch (Exception ex){
    throw new RRException(ex.getMessage());
  }
}

說明:R.error (msg)/ throw new RRExcepion(msg)中,msg應(yīng)該以enum或常量的方式組織起來;
在發(fā)送驗(yàn)證碼、校驗(yàn)驗(yàn)證碼時(shí),應(yīng)該有一個(gè)工具類,驗(yàn)證一個(gè)郵箱在特定的短時(shí)間內(nèi)只能發(fā)送或驗(yàn)證幾次驗(yàn)證碼,超過此限制,應(yīng)該拒絕處理請求;

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中關(guān)于文本文件的讀寫方法實(shí)例總結(jié)

    java中關(guān)于文本文件的讀寫方法實(shí)例總結(jié)

    這篇文章主要介紹了java中關(guān)于文本文件的讀寫方法,實(shí)例總結(jié)了Java針對文本文件讀寫的幾種常用方法,并對比了各個(gè)方法的優(yōu)劣及特點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • IntelliJ IDEA運(yùn)行bat腳本,自動(dòng)taskkill端口進(jìn)程

    IntelliJ IDEA運(yùn)行bat腳本,自動(dòng)taskkill端口進(jìn)程

    這篇文章主要介紹了IDEA里面無法運(yùn)行bat文件的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 利用Sharding-Jdbc進(jìn)行分庫分表的操作代碼

    利用Sharding-Jdbc進(jìn)行分庫分表的操作代碼

    sharding-jdbc是一個(gè)分布式的關(guān)系型數(shù)據(jù)庫中間件,今天通過本文給大家介紹利用Sharding-Jdbc進(jìn)行分庫分表的操作代碼,代碼簡單易懂對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-01-01
  • Maven設(shè)置使用自定義的jar包到自己本地倉庫

    Maven設(shè)置使用自定義的jar包到自己本地倉庫

    今天小編就為大家分享一篇關(guān)于Maven設(shè)置使用自定義的jar包到自己本地倉庫的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • SpringMVC常用注解載入與處理方式詳解

    SpringMVC常用注解載入與處理方式詳解

    這篇文章主要介紹了SpringMVC常用注解載入的方式和處理的方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • SpringBoot統(tǒng)計(jì)、監(jiān)控SQL運(yùn)行情況的方法詳解

    SpringBoot統(tǒng)計(jì)、監(jiān)控SQL運(yùn)行情況的方法詳解

    這篇文章主要給大家介紹了關(guān)于SpringBoot統(tǒng)計(jì)、監(jiān)控SQL運(yùn)行情況的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Spring 異常單元測試的解決

    Spring 異常單元測試的解決

    這篇文章主要介紹了Spring 異常單元測試的解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • java編寫冒泡排序的完整示例

    java編寫冒泡排序的完整示例

    這篇文章主要給大家介紹了關(guān)于java編寫冒泡排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring Boot 實(shí)現(xiàn)Restful webservice服務(wù)端示例代碼

    Spring Boot 實(shí)現(xiàn)Restful webservice服務(wù)端示例代碼

    這篇文章主要介紹了Spring Boot 實(shí)現(xiàn)Restful webservice服務(wù)端示例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11
  • 詳解時(shí)間輪TimeWheel的工作原理

    詳解時(shí)間輪TimeWheel的工作原理

    時(shí)間輪(TimeWheel)作為一種高效率的計(jì)時(shí)器實(shí)現(xiàn)方案,在1987年發(fā)表的論文Hashed?and?Hierarchical?Timing?Wheels中被首次提出。本文主要來聊聊它的工作原理,感興趣的可以了解一下
    2023-02-02

最新評論