手把手教你用 Spring Boot 为「手迹」用户忘记密码功能

本文详细讲了重置密码功能的实现流程,包括账号验证、邮箱验证以及新密码重新设置。
1
vue路由配置

请在项目目录下的 router 文件夹中找到对应的路由配置文件,定位到其中的 routes 数组,并在该数组中添加以下路由项:
{
path: '/forgetPassword',
component: () => import('@/view/forgetPassword/index.vue')
}
这样即可完成密码找回页面的路由注册。
routes.ts
1.12KB
2
验证邮箱页面

进入到忘记密码邮箱验证页面,在这个页面输入忘记密码的邮箱,邮箱必须为已注册的账号,未注册会有提示并且无法发送验证码。
注意事项:相关代码都放入了附件,整个项目完整的代码放在了末尾。
ForgetPasswordEmailStep.vue
2.33KB
3
发送验证码

下边的内容是发送邮件验证码具体的实现代码,
/**
* 发送邮箱验证码
* 生成 6 位随机验证码并发送到指定邮箱
*
* @param email 接收验证码的邮箱地址
* @return true-发送成功,false-发送失败或验证码已存在
*/
@Override
public Boolean sendCode(String email) {
log.info("准备发送验证码到邮箱:{}", email);
// 检查是否已存在未过期的验证码
Boolean hasKey = redisUtils.hasKey(email);
if (hasKey) {
log.warn("验证码已存在,请勿重复发送:{}", email);
return false;
}
// 生成 6 位随机验证码
String code = CaptchaUtils.generateCaptcha();
// 发送邮件
Boolean sendMail = emailService.sendAuthCodeEmail("账号验证", email, code);
if (sendMail) {
// 将验证码存入 Redis,有效期 5 分钟
redisUtils.set(email, code, 5, TimeUnit.MINUTES);
log.info("验证码发送成功:{}", email);
return true;
}
log.error("验证码发送失败:{}", email);
return false;
}
4
验证邮箱码页面

账号验证成功后,系统将发送一封包含验证码的邮件。随后,您将进入“验证邮箱验证码”页面,在此输入收到的验证码进行校验:
- 若验证码正确,验证通过;
- 若输入错误,系统会提示相应错误信息;
- 您可随时点击“重新发送验证码”以获取新的验证码。
ForgetPasswordCodeStep.vue
2.19KB
5
校验验证码

发送验证码之后,会进入到验证验证码的环节,以下是具体的实现代码。
/**
* 验证邮箱验证码
* 比对用户输入的验证码与 Redis 中存储的是否一致
*
* @param code 用户输入的验证码
* @param mail 邮箱地址
* @return true-验证成功,false-验证失败或验证码已过期
*/
@Override
public Boolean verifyCode(String code, String mail) {
log.info("验证邮箱验证码:{}", mail);
// 检查验证码是否存在(是否过期)
Boolean hasKey = redisUtils.hasKey(mail);
if (!hasKey) {
log.warn("验证码已过期或不存在:{}", mail);
return false;
}
// 获取 Redis 中存储的验证码
String mailCode = redisUtils.get(mail).toString();
// 比对验证码
if (code.equals(mailCode)) {
// 验证成功后删除验证码(防止重复使用)
redisUtils.delete(mail);
log.info("验证码验证成功:{}", mail);
return true;
} else {
log.warn("验证码错误:{}", mail);
return false;
}
}
6
重置密码页面

通过了邮箱的验证后,来到重置密码页面,在这个页面可以输入你新的账号密码。
7
UserDto

UserDto用于在用户忘记密码流程中接收前端提交的表单数据。
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 用户注册 DTO
* 用于接收用户注册时提交的信息
* 包含校验注解,确保输入数据的有效性
*
* @author handwriting
* @version 1.0
* @date 2026/1/21
*/
@Data
public class UserDto {
/**
* 用户名
* 长度必须在 3-20 个字符之间,不能为空
*/
@NotBlank(message = "用户名不能为空")
@Size(min = 3, max = 20, message = "用户名长度必须在 3-20 个字符之间")
private String username;
/**
* 邮箱
* 必须符合邮箱格式,不能为空
*/
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
/**
* 密码
* 长度必须在 6-20 个字符之间,不能为空
*/
@NotBlank(message = "密码不能为空")
@Size(min = 6, max = 20, message = "密码长度必须在 6-20 个字符之间")
private String password;
/**
* 邮箱验证码
* 注册时必须提供有效的邮箱验证码
*/
@NotBlank(message = "验证码不能为空")
private String code;
}
8
忘记密码Controller

该接口是“忘记密码”功能的入口,通过 @RequestBody 注解将前端传入的 JSON 请求体自动映射为 Java 对象。
/**
* 用户找回密码
* 通过邮箱来找回用户的密码
*
* @param userDto 找回信息
* @return 检查结果
*/
@PostMapping("/forget/password")
public R<Void> updateUserPassword(@RequestBody UserDto userDto) {
log.info("用户信息:{}", userDto);
boolean isUpdate = userService.findBackPassword(userDto);
// 修改成功
if (isUpdate) {
return R.success();
}
// 修改失败
return R.error(500, "密码修改失败,请重试");
}
9
忘记密码service

这是“忘记密码”功能的核心实现逻辑。方法通过用户提交的邮箱查找对应账户,若存在则使用安全的密码编码器(如 BCrypt)对新密码加密,并更新数据库中的用户记录。整个过程确保了数据一致性与密码安全性,仅当用户存在且更新成功时返回 true。
/**
* 找回密码
*
* @param userDto 用户信息
* @return 是否修改成功
*/
@Override
public boolean findBackPassword(UserDto userDto) {
// 创建查询条件
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 比对邮箱
queryWrapper.eq(User::getEmail, userDto.getEmail());
// 根据邮箱查找用户信息
User user = userMapper.selectOne(queryWrapper);
// 没有查到对应用户 返回失败
if (Objects.isNull(user)) {
return false;
}
// 加密密码进行存储
user.setPassword(passwordEncoder.encode(userDto.getPassword()));
// 通过id修改用户信息
int i = userMapper.updateById(user);
// i大于0 表示成功 反之失败
return i > 0;
}
10
最终页面

点击重置按钮修改成功后会进入到最终页面,然后返回登录输入账号密码即可登录。
handwriting完整代码.zip
48.95MB
0
0
0
qq空间
微博
复制链接
分享 更多相关项目
猜你喜欢
评论/提问(已发布 0 条)
0