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

SpringBoot發(fā)送郵件功能 驗(yàn)證碼5分鐘過期

 更新時間:2020年03月26日 12:12:21   作者:浩神傳說  
這篇文章主要為大家詳細(xì)介紹了SpringBoot發(fā)送郵件功能,驗(yàn)證碼5分鐘過期,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

springBoot發(fā)送郵件(驗(yàn)證碼,5分鐘過期)超級詳細(xì),供大家參考,具體內(nèi)容如下

自己百度了很久,終于成功了,這里記錄一下過程

1.選擇郵箱(這里選用163郵箱)

首先在網(wǎng)頁登錄在設(shè)置里面打開POP3/SMTP服務(wù)

在application.yaml中配置

要注意的就是這里的password是授權(quán)碼而不是密碼!??!如果使用qq郵箱把host改為smtp.qq.com

2.關(guān)于驗(yàn)證碼的工具類

 private static final String SYMBOLS = "0123456789";
 /**
  * Math.random生成的是一般隨機(jī)數(shù),采用的是類似于統(tǒng)計(jì)學(xué)的隨機(jī)數(shù)生成規(guī)則,其輸出結(jié)果很容易預(yù)測,因此可能導(dǎo)致被攻擊者擊中。
  * 而SecureRandom是真隨機(jī)數(shù),采用的是類似于密碼學(xué)的隨機(jī)數(shù)生成規(guī)則,其輸出結(jié)果較難預(yù)測,若想要預(yù)防被攻擊者攻擊,最好做到使攻擊者根本無法,或不可能鑒別生成的隨機(jī)值和真正的隨機(jī)值。
  */
 private static final Random RANDOM = new SecureRandom();

 public static String generateVerCode() {
  char[] nonceChars = new char[6];
  for (int i = 0; i < nonceChars.length; i++) {
   nonceChars[i] = SYMBOLS.charAt(RANDOM.nextInt(nonceChars.length));
  }
  return new String(nonceChars);
 }

 /**
  *計(jì)算兩個日期的分鐘差
  */
 public static int getMinute(Date fromDate, Date toDate) {
  return (int) (toDate.getTime() - fromDate.getTime()) / (60 * 1000);

3.services模塊

 /**
  * 發(fā)送驗(yàn)證碼到指定郵箱
  * @param sender 發(fā)送地址
  * @param mailSender spring自帶
  * @param receiver 接受地址
  */
 AdvanceResponse getCode(String sender,JavaMailSenderImpl mailSender,String receiver);
 /**
  * 注冊用戶
  */
 AdvanceResponse addUser(User user,String verCode);

AdvanceResponse是自己封裝的返回對象,可以無視

/**
 * 驗(yàn)證碼
*/
private String code;
/**
 * 發(fā)送時間
*/
private Date sendTime;
 @Override
 @Async
 public AdvanceResponse getCode(String sender, JavaMailSenderImpl mailSender, String receiver) {
  SimpleMailMessage message = new SimpleMailMessage();
  message.setSubject("驗(yàn)證碼");//設(shè)置郵件標(biāo)題
  code = VerCodeGenerateUtil.generateVerCode();
  sendTime = new Date();
  message.setText("尊敬的用戶,您好:\n"
    + "\n本次請求的郵件驗(yàn)證碼為:" + code + ",本驗(yàn)證碼5分鐘內(nèi)有效,請及時輸入。(請勿泄露此驗(yàn)證碼)\n"
    + "\n如非本人操作,請忽略該郵件。\n(這是一封自動發(fā)送的郵件,請不要直接回復(fù))"); //設(shè)置郵件正文
  message.setFrom(sender);//發(fā)件人
  message.setTo(receiver);//收件人
  mailSender.send(message);//發(fā)送郵件
  return AdvanceResponse.successResponse();
 }

 @Override
 public AdvanceResponse addUser(User user, String verCode) {
  Date date = new Date();
  //判斷驗(yàn)證碼
  if (VerCodeGenerateUtil.getMinute(sendTime, date) > 5) {
   return AdvanceResponse.failedResponse("驗(yàn)證碼已經(jīng)失效?。?!");
  }
  if (!verCode.equals(code)) {
   return AdvanceResponse.failedResponse("驗(yàn)證碼不正確?。?!");
  }
  user.setRole(0);
  user.setCreateTime(date);
  user.setUpdateTime(date);
  userDao.insert(user);
  code = null;
  return AdvanceResponse.successResponse();
 }

@Async表示異步,可以在郵件未發(fā)送完成時就返回,而不必等待太長時間,必須在總配置類上加@EnableAsync注解才可以生效

4.controller模塊

@Autowired
 private UserService userService;
 @Autowired
 private JavaMailSenderImpl mailSender;
 @Value("${spring.mail.username}")
 private String sender;
 
 /**
  * 發(fā)送驗(yàn)證碼到指定郵箱
  */
 @GetMapping("/verCode")
 public AdvanceResponse verCode(String receiver) {
  return userService.getCode(sender, mailSender, receiver);
 }

 /**
  * 注冊用戶
  */
 @PostMapping("/addUser")
 public AdvanceResponse addUser(User user, String sender, JavaMailSenderImpl mailSender, @RequestParam("verCode") String verCode) {
  return userService.addUser(user,verCode);
 }

基本上后端就完成了,在來看看前端

5.前端界面

 <div class="layui-form-item">
    <label for="email" class="layui-form-label">
     <span class="x-red">*</span>郵箱
    </label>
    <div class="layui-input-inline">
     <input type="email" id="email" name="email" required="" lay-verify="email"
       autocomplete="off" class="layui-input">
    </div>
    <div class="layui-form-mid layui-word-aux">
     <span class="x-red" id="emailMsg"></span>
    </div>
    <button type="button" class="layui-btn" id="code">獲取驗(yàn)證碼</button>
   </div>
   <div class="layui-form-item">
    <label for="verCode" class="layui-form-label">
     <span class="x-red">*</span>驗(yàn)證碼
    </label>
    <div class="layui-input-inline">
     <input type="text" id="verCode" name="verCode" required=""
       autocomplete="off" class="layui-input">
    </div>
    <div class="layui-form-mid layui-word-aux">
     <span class="x-red" id="verCodeMsg"></span>
    </div>
</div>

前端使用了layui,只關(guān)注input表單即可

接下來是js代碼

 //獲取驗(yàn)證碼
 $('#code').click(function () {
  const email = $('#email').val();
  const myReg = /^[a-zA-Z0-9_-]+@([a-zA-Z0-9]+\.)+(com|cn|net|org)$/;
  if (email === null || email.length === 0) {
   layer.msg('郵箱不能為空!', {time: 1500, icon: 5, shift: 6});
   return false;
  }
  if (!myReg.test(email)) {
   layer.msg('郵箱格式不正確!', {time: 1500, icon: 5, shift: 6});
   return false;
  }
  $.ajax({
   type: 'GET',
   url: 'user/verCode',
   data: {
    'receiver': email
   },
   beforeSend: function () {
    loading = layer.msg('處理中', {icon: 16})
   },
   success: function () {
    layer.close(loading);
   }
  })
 });
 //這是提交表單,只保留關(guān)鍵部分
 $.ajax({
   type: 'POST',
   url: 'user/addUser',
   data: formData,
   cache: false,   // 不緩存
   processData: false,  // jQuery不要去處理發(fā)送的數(shù)據(jù)
   contentType: false,  // jQuery不要去設(shè)置Content-Type請求頭
   beforeSend: function () {
    loading = layer.msg('處理中', {icon: 16})
   },
   success: function (result) {
    if (result.status === 0) {
     layer.msg(result.msg, {time: 1500, icon: 5, shift: 6});
    } else {
     layer.close(loading);
     xadmin.close();
    }
   }
  })

基本上全部完成!

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

相關(guān)文章

  • Java集合框架中迭代器Iterator解析

    Java集合框架中迭代器Iterator解析

    這篇文章主要為大家簡單介紹了Java集合框架中迭代器Iterator的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 關(guān)于Java應(yīng)用日志與Jaeger的trace關(guān)聯(lián)的問題

    關(guān)于Java應(yīng)用日志與Jaeger的trace關(guān)聯(lián)的問題

    這篇文章主要介紹了Java應(yīng)用日志如何與Jaeger的trace關(guān)聯(lián),通過jaeger發(fā)現(xiàn)這十次請求中有一次耗時特別長,想定位一下具體原因,感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Java中的邏輯結(jié)構(gòu)詳解

    Java中的邏輯結(jié)構(gòu)詳解

    這篇文章主要介紹了Java中的邏輯結(jié)構(gòu)詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • SpringBoot詳解如何實(shí)現(xiàn)讀寫分離

    SpringBoot詳解如何實(shí)現(xiàn)讀寫分離

    當(dāng)響應(yīng)的瓶頸在數(shù)據(jù)庫的時候,就要考慮數(shù)據(jù)庫的讀寫分離,當(dāng)然還可以分庫分表,那是單表數(shù)據(jù)量特別大,當(dāng)單表數(shù)據(jù)量不是特別大,但是請求量比較大的時候,就要考慮讀寫分離了.具體的話,還是要看自己的業(yè)務(wù)...如果還是很慢,那就要分庫分表了...我們這篇就簡單講一下讀寫分離
    2022-05-05
  • springboot restTemplate連接池整合方式

    springboot restTemplate連接池整合方式

    這篇文章主要介紹了springboot restTemplate連接池整合方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • IDEA上撤銷和返回撤銷的快捷鍵設(shè)置方式

    IDEA上撤銷和返回撤銷的快捷鍵設(shè)置方式

    文章講述了如何在軟件中設(shè)置快捷鍵,以實(shí)現(xiàn)撤銷和重做操作,具體步驟包括:打開設(shè)置菜單,選擇KeyMap,搜索undo或redo,右鍵添加快捷鍵,然后選擇或設(shè)置快捷鍵,文中提供了個人經(jīng)驗(yàn),并鼓勵大家支持腳本之家
    2025-03-03
  • 最新IntelliJ IDEA2017.3 激活方式

    最新IntelliJ IDEA2017.3 激活方式

    本文給大家提供最新IntelliJ IDEA2017.3 激活方式,本文給大家介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • URLConnection發(fā)送HTTP請求的方法_動力節(jié)點(diǎn)Java學(xué)院整理

    URLConnection發(fā)送HTTP請求的方法_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了URLConnection發(fā)送HTTP請求的方法,主要介紹了如何通過Java(模擬瀏覽器)發(fā)送HTTP請求,有興趣的可以了解一下
    2017-07-07
  • 教你用IDEA配置JUnit并進(jìn)行單元測試

    教你用IDEA配置JUnit并進(jìn)行單元測試

    今天教各位小伙伴怎么用IDEA配置JUnit并進(jìn)行單元測試,文中有非常詳細(xì)的圖文介紹及代碼示例,對正在學(xué)習(xí)IDEA的小伙伴有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java接口的作用以及使用說明

    Java接口的作用以及使用說明

    接口是一種規(guī)范,定義了一組方法的原型,但沒有實(shí)現(xiàn),類通過實(shí)現(xiàn)接口來實(shí)現(xiàn)接口中的抽象方法,接口可以提供規(guī)范性、擴(kuò)展性和可插入性,在Java中,接口可以用來聲明一個變量,實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)接口中定義的所有方法,接口提供了一種機(jī)制
    2024-11-11

最新評論