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

基于SpringBoot實現(xiàn)郵箱找回密碼的代碼示例

 更新時間:2024年02月23日 10:50:44   作者:七維大腦  
本文主要介紹了如何基于SpringBoot實現(xiàn)郵箱找回密碼,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

1. 實現(xiàn)思路

  1. 用戶點擊忘記密碼
  2. 用戶輸入用戶名以及郵箱,點擊獲取驗證碼
  3. 后端校驗用戶名以及郵箱,正確后生成驗證碼
  4. 生成的驗證碼作為value,前綴加用戶名為key,放入redis中并設(shè)置過期時間
  5. 用戶輸入驗證碼以及新的密碼點擊保存
  6. 后端通過前綴+用戶名獲取驗證碼,校驗驗證碼的正確性
  7. 密碼修改成功

2. 前端UI頁面

圖為ProcessOn所畫,可作為借鑒。也可設(shè)計為先驗證用戶名然后再進入改密碼頁面。

3. 發(fā)件郵箱要求

作者使用的是163郵箱(其他郵箱也基本一致),需要設(shè)置POP3/SMTP/IMAP

開啟

  • IMAP/SMTP服務(wù)
  • POP3/SMTP服務(wù)
    開啟會讓設(shè)置授權(quán)碼,授權(quán)碼要記牢!后面需要寫在配置里

再往下翻有163 SMTP服務(wù)器地址 等下需要配置在application.yml中

各家郵箱大同小異,企業(yè)郵箱的話應(yīng)該是可以直接用的,不用開啟。

4. 代碼實現(xiàn)

4.1 依賴

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

4.2 application.yml配置

# 配置郵箱服務(wù)器,賬號密碼等
spring:
  mail:
    host: smtp.163.com
    username: xxxxxx@163.com
    password: ERBDGXLVJAQMWMDI(授權(quán)碼)

4.3 獲取驗證碼controller

import com.clisoft.srmsbackend.common.response.ServerResponse;
import com.clisoft.srmsbackend.service.IMailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 郵箱業(yè)務(wù) 前端控制器
 * @author zzw
 * @date 2022-01-14
 */
@Api(tags = "郵箱業(yè)務(wù)管理")
@RestController
@RequestMapping("/mail")
public class MailController {

    @Autowired
    private IMailService mailService;

    /**
     * 獲取重置密碼的驗證碼
     */
    @ApiOperation(value = "獲取重置密碼的驗證碼", notes = "獲取重置密碼的驗證碼", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "staffNumber", value = "用戶編號(賬號)", required = true, paramType = "form"),
            @ApiImplicitParam(name = "mailAddress", value = "郵箱地址", required = true, paramType = "form"),
    })
    @GetMapping("/getCode")
    public ServerResponse getCode(String staffNumber,String mailAddress){
        return mailService.getCode(staffNumber,mailAddress);
    }
}

4.4 ServiceImpl層

import com.clisoft.srmsbackend.common.constant.Constants;
import com.clisoft.srmsbackend.common.response.ServerResponse;
import com.clisoft.srmsbackend.config.MailCodeConfig;
import com.clisoft.srmsbackend.dao.entity.PersStaff;
import com.clisoft.srmsbackend.dao.mapper.PersStaffMapper;
import com.clisoft.srmsbackend.framework.redis.RedisCache;
import com.clisoft.srmsbackend.service.IMailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * 郵箱業(yè)務(wù) 實現(xiàn)類
 *
 * @author zzw
 * @date 2022-01-14
 */
@Service
public class MailServiceImpl implements IMailService {

    @Autowired
    private PersStaffMapper persStaffMapper;

    @Autowired
    private MailCodeConfig mailCodeConfig;

    @Autowired
    private RedisCache redisCache;

    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String mailUserName;

    /**
     * 獲取重置密碼的驗證碼
     *
     * @param staffNumber 用戶賬號
     * @param mailAddress 用戶郵箱
     * @return
     */
    @Override
    public ServerResponse getCode(String staffNumber, String mailAddress) {
        // 非空校驗
        if (null == staffNumber || "".equals(staffNumber)) return ServerResponse.createByErrorMessage("賬號不能為空!");
        if (null == mailAddress || "".equals(mailAddress)) return ServerResponse.createByErrorMessage("郵箱不能為空!");

        // 賬號存在校驗
        PersStaff persStaff = persStaffMapper.selectPersStaffByStaffNumber(staffNumber);
        if (null == persStaff) return ServerResponse.createBySuccessMessage("賬號不存在!");
        if (!persStaff.getEmail().equals(mailAddress)) return ServerResponse.createByErrorMessage("輸入郵箱和預(yù)留郵箱不一致!");

        String verifyCode = redisCache.getCacheObject(Constants.MAIL_CODE_KEY + staffNumber);
        if (verifyCode == null) {
            verifyCode = String.valueOf(new Random().nextInt(899999) + 100000);//生成短信驗證碼
        }
        Integer overtime = mailCodeConfig.getOvertime(); // 過期時間
        // 驗證碼存入redis并設(shè)置過期時間
        redisCache.setCacheObject(Constants.MAIL_CODE_KEY + staffNumber, verifyCode, overtime, TimeUnit.MINUTES);

        // 編寫郵箱內(nèi)容
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<html><head><title></title></head><body>");
        stringBuilder.append("您好<br/>");
        stringBuilder.append("您的驗證碼是:").append(verifyCode).append("<br/>");
        stringBuilder.append("您可以復(fù)制此驗證碼并返回至科研管理系統(tǒng)找回密碼頁面,以驗證您的郵箱。<br/>");
        stringBuilder.append("此驗證碼只能使用一次,在");
        stringBuilder.append(overtime.toString());
        stringBuilder.append("分鐘內(nèi)有效。驗證成功則自動失效。<br/>");
        stringBuilder.append("如果您沒有進行上述操作,請忽略此郵件。");
        MimeMessage mimeMessage = mailSender.createMimeMessage();

        // 發(fā)件配置并發(fā)送郵件
        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            //這里只是設(shè)置username 并沒有設(shè)置host和password,因為host和password在springboot啟動創(chuàng)建JavaMailSender實例的時候已經(jīng)讀取了
            mimeMessageHelper.setFrom(mailUserName);
            // 用戶的郵箱地址
            mimeMessageHelper.setTo(mailAddress);
            // 郵件的標(biāo)題
            mimeMessage.setSubject("郵箱驗證-科研管理系統(tǒng)");
            // 上面所拼接的郵件內(nèi)容
            mimeMessageHelper.setText(stringBuilder.toString(), true);
            mailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return ServerResponse.createBySuccessMessage("獲取驗證碼成功,請查看移步您的郵箱" + mailAddress + "查看驗證碼!");
    }
}

4.5 修改密碼controller

/**
     * 驗證碼重置密碼
     */
    @ApiOperation(value = "驗證碼重置密碼", notes = "驗證碼重置密碼", httpMethod = "POST")
    @PostMapping("/codeUpdatePwd")
    public ServerResponse codeUpdatePwd(@RequestBody CodeUpdatePwdVo codeUpdatePwdVo){
        return persStaffService.codeUpdatePwd(codeUpdatePwdVo);
    }

4.6 修改密碼ServiceImpl

 /**
     * 驗證碼重置密碼
     *
     * @param codeUpdatePwdVo
     * @return
     */
    @Override
    public ServerResponse codeUpdatePwd(CodeUpdatePwdVo codeUpdatePwdVo) {
        String staffNumber = codeUpdatePwdVo.getStaffNumber();
        String code = codeUpdatePwdVo.getCode();
        String loginPassword = codeUpdatePwdVo.getLoginPassword();
        // 非空校驗
        if (null == staffNumber || "".equals(staffNumber)) return ServerResponse.createByErrorMessage("賬號不能為空!");
        if (null == code || "".equals(code)) return ServerResponse.createByErrorMessage("驗證碼不能為空!");
        if (null == loginPassword || "".equals(loginPassword)) return ServerResponse.createByErrorMessage("密碼不能為空!");

        // 賬號存在校驗
        PersStaff persStaff = persStaffMapper.selectPersStaffByStaffNumber(staffNumber);
        if (null == persStaff) return ServerResponse.createBySuccessMessage("賬號不存在!");

        // 驗證碼過期校驗
        String cacheCode = redisCache.getCacheObject(Constants.MAIL_CODE_KEY + staffNumber); // 獲取緩存中該賬號的驗證碼
        if (cacheCode == null) {
            return ServerResponse.createByErrorMessage("驗證碼已過期,請重新獲?。?);
        }

        // 驗證碼正確性校驗
        if (!cacheCode.equals(code)) {
            return ServerResponse.createByErrorMessage("驗證碼錯誤!");
        }

        // 修改密碼
        int result = 0;
        try {
            result = persStaffMapper.updatePwdByStaffNumber(staffNumber, PasswordStorageUtil.createHash(codeUpdatePwdVo.getLoginPassword()));
        } catch (PasswordStorageUtil.CannotPerformOperationException e) {
            return ServerResponse.createByErrorMessage("密碼加密時發(fā)生錯誤");
        }
        if (result > 0) {
            // 將驗證碼過期
            redisCache.expire(Constants.MAIL_CODE_KEY + staffNumber, 0);
            return ServerResponse.createBySuccessMessage("密碼充值成功!請牢記您的密碼!");
        }

        return ServerResponse.createByErrorMessage("未知錯誤,密碼修改失敗,請重試!");
    }

4.7 效果圖

demo地址:https://gitee.com/lm_8692769/email-reset-password-demo

以上就是基于SpringBoot實現(xiàn)郵箱找回密碼的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot實現(xiàn)郵箱找回密碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實現(xiàn)多線程下載和斷點續(xù)傳

    Java實現(xiàn)多線程下載和斷點續(xù)傳

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)多線程下載和斷點續(xù)傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • springboot整合騰訊云短信開箱即用的示例代碼

    springboot整合騰訊云短信開箱即用的示例代碼

    這篇文章主要介紹了springboot整合騰訊云短信開箱即用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • springboot整合spring-data-redis遇到的坑

    springboot整合spring-data-redis遇到的坑

    使用springboot整合redis,使用默認(rèn)的序列化配置,然后使用redis-client去查詢時查詢不到相應(yīng)的key.問題出在哪,怎么解決呢?下面小編給大家?guī)砹藄pringboot整合spring-data-redis遇到的坑,需要的的朋友參考下吧
    2017-04-04
  • Java 內(nèi)存模型 (JMM) 與 volatile 底層實現(xiàn)

    Java 內(nèi)存模型 (JMM) 與 volatile 底層實現(xiàn)

    這篇文章詳細(xì)介紹了Java中的volatile關(guān)鍵字,從硬件底層到JVM規(guī)范,逐步講解了它的核心原理,包括可見性和禁止重排序,文章還探討了volatile的使用場景、常見誤區(qū)以及在實際工作中的應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • idea2020最新版配置maven的方法

    idea2020最新版配置maven的方法

    這篇文章主要介紹了idea2020最新版配置maven的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Spring?Cloud?整合?nacos實現(xiàn)動態(tài)配置中心的詳細(xì)步驟

    Spring?Cloud?整合?nacos實現(xiàn)動態(tài)配置中心的詳細(xì)步驟

    這篇文章主要介紹了Spring?Cloud?整合?nacos?實現(xiàn)動態(tài)配置中心,整合步驟是通過添加依賴新建nacos配置,本文分步驟通過實例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • Java模擬計算機的整數(shù)乘積計算功能示例

    Java模擬計算機的整數(shù)乘積計算功能示例

    這篇文章主要介紹了Java模擬計算機的整數(shù)乘積計算功能,簡單分析了計算機數(shù)值進制轉(zhuǎn)換與通過位移進行乘積計算的原理,并結(jié)合具體實例給出了java模擬計算機成績運算的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Java語言Consistent Hash算法學(xué)習(xí)筆記(代碼示例)

    Java語言Consistent Hash算法學(xué)習(xí)筆記(代碼示例)

    這篇文章主要介紹了Java語言Consistent Hash算法學(xué)習(xí)筆記(代碼示例),分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • java判斷字符串中是否包含中文并過濾中文

    java判斷字符串中是否包含中文并過濾中文

    這篇文章主要為大家詳細(xì)介紹了java判斷字符串中是否包含中文,并過濾掉中文,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • java實現(xiàn)單人版五子棋游戲

    java實現(xiàn)單人版五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)五子棋小游戲的相關(guān)資料,十分簡單實用,有不錯的參考借鑒價值,推薦給大家,需要的朋友可以參考下
    2016-02-02

最新評論

开原市| 叶城县| 道真| 本溪市| 德钦县| 固镇县| 专栏| 璧山县| 增城市| 剑阁县| 容城县| 松原市| 丹东市| 广平县| 沿河| 当涂县| 临邑县| 秦安县| 永靖县| 普兰店市| 牡丹江市| 林芝县| 平凉市| 古交市| 江山市| 中江县| 蓝山县| 琼结县| 明水县| 盐城市| 紫金县| 桐城市| 通城县| 宝应县| 台东县| 吴旗县| 慈溪市| 武夷山市| 龙游县| 安福县| 苍梧县|