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

网友投稿 417 2022-09-02


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

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

一、主要内容

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

二、邮箱找回密码的思想

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

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

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

三、前台页面

四、注意事项

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

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

五、部分实现代码

pom.xml 添加依赖

org.springframework.boot

spring-boot-starter-mail

application.properties 配置文件

#这里使用的是阿里企业邮箱

spring.mail.host=smtp.qiye.aliyun.com

spring.mail.username=****@XXXX.com

spring.mail.password=123456

5.1 页面代码

获取验证码

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 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 map) throws MessagingException {

String loginNameReset = StringUtil.toString(map.get("loginNameReset")).trim();

if (StringUtil.isEmpty(loginNameReset)){

return ProcResult.error(ErrorCode.USER_LOGIN_NAME_EMPTY);

}

List 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("

stringBuilder.append("您好
");

stringBuilder.append("您的验证码是:").append(verifyCode).append("
");

stringBuilder.append("您可以复制此验证码并返回至XXX,以验证您的邮箱。
");

stringBuilder.append("此验证码只能使用一次,在5分钟内有效。验证成功则自动失效。
");

stringBuilder.append("如果您没有进行上述操作,请忽略此邮件。");

MimeMessage mimeMessage = mailSender.createMimeMessage();

//发送验证码到手机或者是邮箱

if ("1".equals(mvPlCLOap.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 resetPassword(String entity, HttpServletRequest request, HttpServletResponse response) {

return userService.resetPassword(JsonUtil.jsonToMap(entity)).toMap(setting);

}

service层:

/**

* 重新设置密码

* @param map

* @return

*/

public ProcResult resetPassword(Map 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 list = getTeacherByMailOrPhoneNumber(loginNameReset,map.get("resetTypvPlCLOe").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 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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:怎么做接口调试?接口调试的工具有哪些比较好?
下一篇:python 语法规范(python基础教程)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~