一、主要内容

基于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

java 基于springboot邮箱找回密码功能相关推荐

  1. SpringBoot实现通过邮箱找回密码功能

    养成习惯,先赞后看!!! 目录 1.前言 2.步骤 2.1导入依赖 2.2开启邮箱的SMTP服务 2.3配置application.yaml文件 2.4 编写逻辑的步骤 2.4.1创建pm_valid ...

  2. java邮箱找回密码_Spring实现简单的邮箱找回密码功能

    通过spring可以实现简单的邮箱找回密码的功能,在此做一下简单的笔记. 1.首先就是导入一些相关的jar包 2.加入配置文件,具体配置信息如下: encoding="UTF-8" ...

  3. java实现通过绑定邮箱找回密码功能_SpringMVC通过邮件找回密码功能的实现

    1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密 ...

  4. JAVA实现通过绑定邮箱找回密码功能

    1.输入用户名及验证码,验证用户名是否存在 (1).生成验证码工具类 package com.utils; import java.awt.Color; import java.awt.Font; i ...

  5. javaWeb实现使用邮箱邮件找回密码功能

    JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...

  6. Java实现邮箱找回密码

    通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...

  7. java 邮箱找回密码_【JavaWeb】通过邮件找回密码

    前言 本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路.整个实现过程中最重要的就是以下三点: 如何发送邮件到用户指定邮箱 邮件中的重置密码链接构成是怎么样的 验证重置密码链接的合法性(是否过 ...

  8. Java基于springboot开的同学录系统(可以加同学群的功能类似于QQ)有论文

    简介 用户注册可以创建班级(创建者即为群主),用户也可以查找班级申请加入,群主添加同学的联系方式等,可以在班级里留言,管理相册等,还可以指定其他人为群主或者解散班级群,群里的用户可以上传相册. 演示视 ...

  9. 找回密码功能 java_Java实现邮件找回密码功能

    本文实例为大家分享了Java实现邮件找回密码功能的具体代码,供大家参考,具体内容如下 1.有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回, ...

最新文章

  1. 7月关键词“科幻”:梁建章新书《永生之后》发售 人类寿命将达10000年?
  2. 手机充值接口 php,首信易支付,话费充值接口
  3. 力扣--91. 解码方法
  4. 使用javap深入理解Java整型常量和整型变量的区别
  5. spring boot 1.5.4 定时任务和异步调用(十)
  6. inittab文件剖析[CentOS 5.X](第二版)
  7. typora的安装和配置
  8. Go程序设计语言读书笔记-1
  9. 联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC
  10. SQLite 使用(针对Android)
  11. bzoj1189: [HNOI2007]紧急疏散evacuate
  12. 工作绩效数据 工作绩效报告 偏差分析 变更控制流程 变更控制委员会
  13. 戴尔笔记本电脑PIN码忘了, 怎么办
  14. [变分法介绍]优美的旋轮线:最速下降线问题,通过费马光学原理的初等证明
  15. 位置在此计算机上运行程序灰色,Win10电脑中定位服务按钮灰色无法开启的2种解决方法...
  16. 透过“最牛”年报,聊聊优然牧业的“最佳养牛模式”
  17. MT6735手动修改屏幕分辨率
  18. 全球及中国三维精密动作捕捉系统行业研究及十四五规划分析报告
  19. 轮胎规格怎么看?“3T”指数到底是什么?换轮胎前必读!
  20. 商业智能bi时代:商务智能常见应用实例

热门文章

  1. 智能车竞赛技术报告 | 节能信标组 - 浙江大学 - 浙大三队
  2. Nginx是怎么接入HTTP请求的?
  3. 抢到0.01也许不是点背,北大发现微信红包不是随机分配
  4. 利用DuplicateHandle()无驱动的另类读写内存方法,理论上可以过游戏保护读写
  5. Windows10中PyCharm2021.3安装中文包
  6. 【数据结构】基于二叉链表的二叉树结点个数的统计
  7. 【Java】电子凭证-Java生成PDF
  8. 微服务模式:Sidecar
  9. ASP网页FLASH图片播放只能在老版Internet Explorer 正常显示,最新主流浏览器都不支持,哪位大伽有好的代码改动妙招烦请赐教,谢谢
  10. 手机续航测试 软件,7款手机续航测试:华为P30Pro倒数第三 第一名被它抢走