java springboot邮箱找回密码功能的实现讲解

目录
  • 一、主要内容
  • 二、邮箱找回密码的思想
  • 三、前台页面
  • 四、注意事项
  • 五、部分实现代码
    • 5.1 页面代码
    • 5.2 发送验证码到注册邮箱的代码
    • 5.3 修改密码
  • 总结

一、主要内容

基于springboot实现密码找回功能。

二、邮箱找回密码的思想

1.输入注册邮箱,点击获取验证码。会将验证码发送到邮箱。

2.用户进入邮箱,查看验证码。

3.用户输入验证码,输入新密码,点击修改密码,完成修改。

三、前台页面

四、注意事项

如果是163或者qq邮箱需要打开授权,以163为例:

如果是阿里的企业邮箱,则不用打开

五、部分实现代码

pom.xml 添加依赖

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

application.properties 配置文件

#这里使用的是阿里企业邮箱
spring.mail.host=smtp.qiye.aliyun.com
spring.mail.username=****@XXXX.com
spring.mail.password=123456

5.1 页面代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <meta http-equiv="expires" content="0">
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta charset="UTF-8" />
    <title>重置密码</title>
</head>
<body>
<div class="login-bg"></div>
<div class="login-box-reset-pss">
    <div class="logbox-left-pss fl">
        <div class="logbox-logos-pss">
            <img class="sch-logo" src="/images/login_logo.png" alt="" onerror="javascript:this.src='/images/login_logo.png'" />
        </div>
    </div>
    <div class="logbox-right fr">
        <div class="title">重置密码</div>
        <div class="inputbar">
            <input type="text" class="form-control-reset-pss" id="loginNameReset" placeholder="邮箱">
        </div>
        <div class="inputbar">
            <input type="text" class="form-control-reset-pss" id="verificationCode" placeholder="验证码">
            <span class="js-reset-captcha  btn-captcha" id="btn-captcha">获取验证码</span>
        </div>
        <div class="inputbar">
            <input type="password" class="form-control-reset-pss" id="newLoginPwd" placeholder="新密码">
        </div>
        <div class="inputbar">
            <input type="password" class="form-control-reset-pss" id="confirmloginPwd" placeholder="确认新密码">
        </div>
        <div class="logbtn"><button type="button" class="fl btn" id="loginIdReset" style="width:100%;height:100%;">保存</button></div>
        <div class="logbox-error" style="display:;">您输入的用户名或密码有误,请重新输入!</div>
    </div>
</div>
</body>

5.2 发送验证码到注册邮箱的代码

前台代码:

/**
 * 获取验证码
 */
$el_btnVc.on('click', function(){
    var data = {
        loginNameReset: $.trim($el_loginReset.val())
    }
    if(MC.isEmpty(data.loginNameReset)){
        return msg_fn('请输入您的用户名!');
    }
    if (data.loginNameReset.indexOf('.com') > 0 || data.loginNameReset.indexOf('.cn') > 0){
        if (!reg_mail.test(data.loginNameReset)){
            return msg_fn('请您输入正确的邮箱!');
        }
        data.resetType = '1';
    } else {
        if (data.loginNameReset.length != 11){
            return msg_fn('请您输入正确的手机号!');
        }
        data.resetType = '0';
    }
    // verificationMailOrPhone(data);
    reset_getCode(data);
});
/**
 * 获取重置密码的验证码
 * @param data
 */
var reset_getCode = function(data){
    $.ajax({
        url: window.mcConfig.DATA_HOST,
        type: 'post',
        dataType: 'json',
//        async: false,
        data: {
            eventType: "web.teacher.user.resetPassword.code",
            entity: MC.json.encode(data)
        },
        success: function(rsp) {
            if (parseInt(rsp.err) == 0) {
                // window.location.href = data.callback + rsp.code;
                MC.msg('info', '验证码已经发送成功!');
            } else {
                msg_fn(rsp.errMsg || '您输入的用户名或密码有误,请重新输入!');
            }
        },
        error: function(response) {
            if (!response.error) {
                MC.msg('alert', "系统后台异常,请与管理员联系!", 'warn');
            }
        }
    });
};

后台代码:

controller层

/**
 * 获取重置密码的验证码
 * @param entity
 * @param request
 * @param response
 * @return
 */
@RequestMapping(value = "/getCode", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, Object> getCode(String entity, HttpServletRequest request, HttpServletResponse response) throws MessagingException {
    return userService.getCode(JsonUtil.jsonToMap(entity)).toMap(setting);
}

service层:

@Autowired
private JavaMailSender mailSender;

@Value("${spring.mail.username}")
private String mailUserName;
/**
 * 获取重置密码需要的验证码
 * @param map
 * @return
 */
public ProcResult getCode(Map<String, Object> map) throws MessagingException {
    String loginNameReset = StringUtil.toString(map.get("loginNameReset")).trim();
    if (StringUtil.isEmpty(loginNameReset)){
        return ProcResult.error(ErrorCode.USER_LOGIN_NAME_EMPTY);
    }
    List<Teacher> list = getTeacherByMailOrPhoneNumber(loginNameReset,map.get("resetType").toString());
    if (list == null || list.size() == 0) {
        return ProcResult.error(ErrorCode.LOGIN_USER_NOT_EXISTS_ERROR);
    }
    if (list.size() > 1) {
        return ProcResult.error(ErrorCode.USER_NOT_ONE_ERROR);
    }
    Teacher teacher = list.get(0);
    String verifyCode = String.valueOf(new Random().nextInt(899999) + 100000);//生成短信验证码
    Timestamp outDate = new Timestamp(System.currentTimeMillis() + 5 * 60 * 1000);// 5分钟后过期

    //将验证码 和 过期时间更新到数据库
    teacher.setCodeExpiredTime(outDate);
    teacher.setValidataCode(verifyCode);
    teacherDao.update(teacher);
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("<html><head><title></title></head><body>");
    stringBuilder.append("您好<br/>");
    stringBuilder.append("您的验证码是:").append(verifyCode).append("<br/>");
    stringBuilder.append("您可以复制此验证码并返回至XXX,以验证您的邮箱。<br/>");
    stringBuilder.append("此验证码只能使用一次,在5分钟内有效。验证成功则自动失效。<br/>");
    stringBuilder.append("如果您没有进行上述操作,请忽略此邮件。");
    MimeMessage mimeMessage = mailSender.createMimeMessage();

    //发送验证码到手机或者是邮箱
    if ("1".equals(map.get("resetType"))){ //邮箱
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
        mimeMessageHelper.setFrom(mailUserName);//这里只是设置username 并没有设置host和password,因为host和password在springboot启动创建JavaMailSender实例的时候已经读取了
        mimeMessageHelper.setTo(loginNameReset);
        mimeMessage.setSubject("邮箱验证-XXX");
        mimeMessageHelper.setText(stringBuilder.toString(),true);
        mailSender.send(mimeMessage);
    }else if ("0".equals(map.get("resetType"))){ //手机
    }
    return  ProcResult.success();
}

邮箱截图:

5.3 修改密码

前台代码:

/**
 * lpw
 * 重置密码登录操作
 */
$el_btnRt.on('click', function(){
    var reg_mail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;//邮箱格式是否正确
    var data = {
        loginNameReset: $.trim($el_loginReset.val()),
        newPassword : $.trim($el_npwd.val()),
        confirmNewPassword : $.trim($el_cnpwd.val()),
        verificationCode : $.trim($el_vc.val())
    }
    if(MC.isEmpty(data.loginNameReset)){
        return msg_fn('请输入您的用户名!');
    }
    if(MC.isEmpty(data.verificationCode)){
        return msg_fn('请输入验证码!');
    }
    if (data.loginNameReset.indexOf('.com') > 0 || data.loginNameReset.indexOf('.cn') > 0){
        if (!reg_mail.test(data.loginNameReset)){
            return msg_fn('请您输入正确的邮箱!');
        }
        data.resetType = '1';
    } else {
        if (data.loginNameReset.length != 11){
            return msg_fn('请您输入正确的手机号!');
        }
        data.resetType = '0';
    }
    if(MC.isEmpty(data.newPassword)){
        return msg_fn('请输入您的新密码!');
    }
    if(MC.isEmpty(data.confirmNewPassword)){
        return msg_fn('请确认您的新密码!');
    }
    if(data.confirmNewPassword != data.newPassword){
        return msg_fn('两次输入的密码不一致!');
    }
    MC.require('md5', function(exports){
        data.newPassword = hex_md5(data.newPassword);
        data.confirmNewPassword = hex_md5(data.confirmNewPassword);
        reset_PassWord(data);
    });
});
/**
 * 修改密码
 * @param data
 */
var reset_PassWord = function(data){
    $.ajax({
        url: window.mcConfig.DATA_HOST,
        type: 'post',
        dataType: 'json',
//        async: false,
        data: {
            eventType: "web.teacher.user.resetPassword.resetPassword",
            entity: MC.json.encode(data)
        },
        success: function(rsp) {
            if (parseInt(rsp.err) == 0) {
                MC.msg('info', '密码修改成功,请重新登录!');
            } else {
                msg_fn(rsp.errMsg || '您输入的用户名或验证码有误,请重新输入!');
            }
        },
        error: function(response) {
            if (!response.error) {
                MC.msg('alert', "系统后台异常,请与管理员联系!", 'warn');
            }
        }
    });
};

controller层:

/**
 * 修改密码
 * @param entity
 * @param request
 * @param response
 * @return
 */
@RequestMapping(value = "/resetPassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, Object> resetPassword(String entity, HttpServletRequest request, HttpServletResponse response) {
    return userService.resetPassword(JsonUtil.jsonToMap(entity)).toMap(setting);
}

service层:

/**
 * 重新设置密码
 * @param map
 * @return
 */
public ProcResult resetPassword(Map<String, Object> map) {
    String loginNameReset = StringUtil.toString(map.get("loginNameReset")).trim();
    if (StringUtil.isEmpty(loginNameReset)){
        return ProcResult.error(ErrorCode.USER_LOGIN_NAME_EMPTY);
    }
    String newPassword = StringUtil.toString(map.get("newPassword")).trim();
    if (StringUtils.isEmpty(newPassword)) {
        return ProcResult.error(ErrorCode.USER_PASSWORD_EMPTY);
    }
    String verificationCode = StringUtil.toString(map.get("verificationCode")).trim();
    if (StringUtils.isEmpty(verificationCode)) {
        return ProcResult.error(ErrorCode.VERIFICATION_CODE_EMPTY);
    }
    List<Teacher> list = getTeacherByMailOrPhoneNumber(loginNameReset,map.get("resetType").toString());
    if (list == null || list.size() == 0) {
        return ProcResult.error(ErrorCode.LOGIN_USER_NOT_EXISTS_ERROR);
    }
    if (list.size() > 1) {
        return ProcResult.error(ErrorCode.USER_NOT_ONE_ERROR);
    }
    Teacher teacher = list.get(0);
    if (teacher.getValidataCode() == null || "".equals(teacher.getValidataCode())){
        return ProcResult.error(ErrorCode.VERIFICATION_CODE_EMPTY);
    }
    //判断验证码是否还有效
    Date codeExpiredTime = teacher.getCodeExpiredTime();
    Date date = new Date();
    if (date.getTime() > codeExpiredTime.getTime() || "0".equals(teacher.getValidataCode())){
        return ProcResult.error(ErrorCode.VERIFICATION_CODE_INVALID);
    }
    //判断验证码是否正确
    if (!verificationCode.equals(teacher.getValidataCode())){
        return ProcResult.error(ErrorCode.VERIFICATION_CODE_ERROR);
    }
    //通过用户no查询user信息
    QueryConds queryConds = new QueryConds();
    queryConds.cond("userNo", teacher.getUserNo(), QueryOp.EQUAL);
    queryConds.cond("del", ECommon.NO_DEL);
    List<User> listUser = userDao.findUserByConds(queryConds);
    if (listUser == null || listUser.size() == 0) {
        return ProcResult.error(ErrorCode.LOGIN_USER_NOT_EXISTS_ERROR);
    }
    if (listUser.size() > 1) {
        return ProcResult.error(ErrorCode.USER_NOT_ONE_ERROR);
    }
    User user = listUser.get(0);
    //修改密码
    user.setPassword(newPassword);
    user.setUpdateTime(date);
    userDao.update(user);

    //失效当前验证码
    teacher.setValidataCode("0");
    teacher.setUpdateTime(date);
    teacherDao.update(teacher);
    return ProcResult.success();
}

OK,至此,邮箱修改密码功能就完成了。

总结

在不使用spring-boot-starter-mail发送邮件的时候,需要在代码中设置host和password

spring-boot-starter-mail只需要在配置文件中配置,在启动springboot的会去配置文件读取host和password属性。不需要再代码中显性设置。如果不配置springboot启动会报错:

#这里使用的是阿里企业邮箱
spring.mail.host=smtp.qiye.aliyun.com
spring.mail.username=****@XXXX.com
spring.mail.password=123456

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot发送邮箱验证码功能

    一.开启QQ邮箱服务 (1)登陆QQ找到设置,点击账户 (2)往下拉,开启POP3/SMTP服务和IMAP/SMTP服务 当开启IMAP/SMTP会有一串密文密码,保存起来后面要用到 二.spring boot配置邮箱服务   在spring boot的配置文件application.yml中添加以下配置 spring: mail: username: 1963342385@qq.com password: yqc...fchj host: smtp.qq.com password是在开启邮箱服

  • SpringMVC实现通过邮件找回密码功能

    最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户

  • Java实现邮箱找回密码实例代码

    通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱 3.加密能防止

  • springboot实现邮箱验证码功能

    本文实例为大家分享了springboot实现邮箱验证码功能的具体代码,供大家参考,具体内容如下 我这边使用的QQ邮箱 1.首先创建maven项目,配置pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSch

  • java springboot邮箱找回密码功能的实现讲解

    目录 一.主要内容 二.邮箱找回密码的思想 三.前台页面 四.注意事项 五.部分实现代码 5.1 页面代码 5.2 发送验证码到注册邮箱的代码 5.3 修改密码 总结 一.主要内容 基于springboot实现密码找回功能. 二.邮箱找回密码的思想 1.输入注册邮箱,点击获取验证码.会将验证码发送到邮箱. 2.用户进入邮箱,查看验证码. 3.用户输入验证码,输入新密码,点击修改密码,完成修改. 三.前台页面 四.注意事项 如果是163或者qq邮箱需要打开授权,以163为例: 如果是阿里的企业邮箱

  • java实现通过绑定邮箱找回密码功能

    本文实例为大家分享了java实现通过绑定邮箱找回密码功能,供大家参考,具体内容如下 1.输入用户名及验证码,验证用户名是否存在 (1).生成验证码工具类 package com.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map

  • Java实现邮件找回密码功能

    本文实例为大家分享了Java实现邮件找回密码功能的具体代码,供大家参考,具体内容如下 1.有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最

  • Asp.NEt邮箱验证修改密码通过邮箱找回密码功能

    使用邮箱验证修改密码,在这里我是使用163免费邮进行测试 前台代码 <input type="text" name="Mail" id="Mail"/> <span>*请输入邮箱</span><br/> <asp:Button ID="zhuce" runat="server" Text="tijiao" OnClick="

  • PHP会员找回密码功能的简单实现

    设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的"找回密码"超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3.系统通过该邮箱,从数据库中查找到该用户信息,并更新该用户的密码为一个临时密码(比如:12345678). 4.系统借助Jmail功能把该用户的信息发送到该用户的邮箱中(内容包括:用户名.临时密码.提醒用户及时修改临时密码的提示语). 5.用户用临时密码即可登录. HTML 我们在找回密码的

  • Django实现发送邮件找回密码功能

    在各大网站上,一定都遇到过找回密码的问题,通常采用的方式是通过发送带有验证码的邮件进行身份验证,本文将介绍通过Django实现邮件找回密码功能. 找回密码流程 功能流程: 1.首先在用户登录界面,添加"忘记密码"链接 2.生成随机验证码,发送邮件到用户信息中填写邮箱 3.在重置密码页面,验证填写验证码是否需匹配 4.重置密码成功,重新进入到登录页面 技术点: 1.发送邮件使用Django内置的django.core.mail实现 2.重置密码页面验证验证码填写是否匹配,提前将发送的验证

  • Python实现在线暴力破解邮箱账号密码功能示例【测试可用】

    本文实例讲述了Python实现在线暴力破解邮箱账号密码功能.分享给大家供大家参考,具体如下: dic 字典格式如下(mail.txt) : username@gmail.com:password username@gmail.com:password username@gmail.com:password 以此类推,切记保存成utf-8编码格式. 放置在当前脚本目录,也可自己定义修改. 支持ssl https /imap协议. # version 3.4.0 # coding='UTF-8' #

  • java web response提供文件下载功能的实例讲解

    webapp项目的结构如下图: download.html文件的内容如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>资源下载:</h1> <p> 单纯地使用a标签时,只有浏览器不能解析的文

随机推荐