色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:4日期:2023-05-26 15:51:37

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

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

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

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

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

在application.yaml中配置

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

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

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

private static final String SYMBOLS = '0123456789'; /** * Math.random生成的是一般隨機(jī)數(shù),采用的是類(lèi)似于統(tǒng)計(jì)學(xué)的隨機(jī)數(shù)生成規(guī)則,其輸出結(jié)果很容易預(yù)測(cè),因此可能導(dǎo)致被攻擊者擊中。 * 而SecureRandom是真隨機(jī)數(shù),采用的是類(lèi)似于密碼學(xué)的隨機(jī)數(shù)生成規(guī)則,其輸出結(jié)果較難預(yù)測(cè),若想要預(yù)防被攻擊者攻擊,最好做到使攻擊者根本無(wú)法,或不可能鑒別生成的隨機(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ì)算兩個(gè)日期的分鐘差 */ 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); /** * 注冊(cè)用戶 */ AdvanceResponse addUser(User user,String verCode);

AdvanceResponse是自己封裝的返回對(duì)象,可以無(wú)視

/** * 驗(yàn)證碼*/private String code;/** * 發(fā)送時(shí)間*/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本次請(qǐng)求的郵件驗(yàn)證碼為:' + code + ',本驗(yàn)證碼5分鐘內(nèi)有效,請(qǐng)及時(shí)輸入。(請(qǐng)勿泄露此驗(yàn)證碼)n' + 'n如非本人操作,請(qǐng)忽略該郵件。n(這是一封自動(dòng)發(fā)送的郵件,請(qǐng)不要直接回復(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ā)送完成時(shí)就返回,而不必等待太長(zhǎng)時(shí)間,必須在總配置類(lèi)上加@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); } /** * 注冊(cè)用戶 */ @PostMapping('/addUser') public AdvanceResponse addUser(User user, String sender, JavaMailSenderImpl mailSender, @RequestParam('verCode') String verCode) { return userService.addUser(user,verCode); }

基本上后端就完成了,在來(lái)看看前端

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' name='email' required='' lay-verify='email' autocomplete='off' class='layui-input'> </div> <div class='layui-form-mid layui-word-aux'> <span id='emailMsg'></span> </div> <button type='button' 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' name='verCode' required='' autocomplete='off' class='layui-input'> </div> <div class='layui-form-mid layui-word-aux'> <span id='verCodeMsg'></span> </div></div>

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

接下來(lái)是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請(qǐng)求頭 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(); } } })

基本上全部完成!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 特黄特级a级黄毛片免费观看多人 | 亚洲国产成人久久综合区 | 免费视频一区二区 | 久久se精品一区二区国产 | 日本在线免费观看视频 | 成人a视频 | 亚洲人欧洲日韩 | 日韩二区三区 | 亚洲精品一区二区手机在线 | 一级毛片韩国 | 欧美一级毛片美99毛片 | 国产亚洲精品成人a在线 | 欧美一级二级三级视频 | 欧美在线视频看看 | 日韩欧美黄色 | 在线免费视频 | 男女乱配视频免费观看 | 偷拍自拍视频在线 | 香港三级做爰大爽视频 | 在线男人的天堂 | 国产成人亚洲精品影院 | 欧美日本一区二区三区道 | 久久精品女人毛片国产 | 免费看一区二区三区 | 国产成人精品一区二三区2022 | 私人午夜影院 | 国产精品久久久久影院色 | 亚洲精品一区91 | 日本私人色多多 | 欧美亚洲不卡 | 欧美日韩精品乱国产538 | 国产精品久久久久久久毛片 | 草草影院免费 | 国产精品三区四区 | 国内自拍区 | 91精品自在拍精选久久 | 国产激情一区二区三区成人91 | 男人天堂久久 | 97免费在线观看视频 | 亚洲天堂免费在线视频 | 亚洲在线播放视频 |