Spring boot+Vue3博客平台:修改密码与找回密码的设计与实现

news2025/3/1 8:52:27

修改密码与找回密码功能的设计与实现涉及到前后端的配合。本文将详细介绍如何通过设计思路、技术实现和代码示例实现这两个功能。

一、修改密码功能

  1. 设计思路

在设计修改密码功能时,需要注意以下几点:

  • 用户输入的当前密码需要正确
  • 新密码需要满足一定的安全性要求,如长度、字符组合等
  • 用户在输入新密码时,需要提供确认密码字段以避免输入错误
  1. 技术实现

前端代码请参考上文已提供的修改密码部分。

后端代码也已在上文提供。

二、找回密码功能

  1. 设计思路

找回密码功能通常需要用户提供邮箱或手机号等联系方式,并通过发送验证码的方式进行身份验证。设计时,需要考虑以下几点:

  • 用户提供的联系方式需与注册时填写的一致
  • 发送验证码需要限制发送频率,防止恶意攻击
  • 验证码具有一定的时效性
  1. 技术实现

(1) 用户请求发送验证码

在前端,创建一个找回密码表单,让用户输入注册时填写的邮箱地址。提交表单后,调用后端接口请求发送验证码。

<template>
  <!-- ... -->
  <div class="forgot-password">
    <h3>Forgot Password</h3>
    <form @submit.prevent="requestResetCode">
      <div class="form-group">
        <label for="email">Email</label>
        <input type="email" v-model="email" id="email" required />
      </div>
      <button type="submit">Send Verification Code</button>
    </form>
  </div>
  <!-- ... -->
</template>

<script>
export default {
  // ...
  data() {
    return {
      email: "",
    };
  },
  methods: {
    async requestResetCode() {
      try {
        await this.$http.post("/user/forgot-password", { email: this.email });
        // Handle success
      } catch (error) {
        // Handle error
      }
    },
  },
};
</script>

在后端,创建一个处理找回密码请求的接口。首先,验证用户提供的邮箱地址是否存在。然后,生成验证码并发送到用户邮箱。

@PostMapping("/forgot-password")
public ResponseEntity<?> forgotPassword(@Valid @RequestBody ForgotPasswordForm forgotPasswordForm) {
    User user = userRepository.findByEmail(forgotPasswordForm.getEmail());
    if (user != null) {
        String resetCode = generateResetCode();
        // 将验证码与用户关联并存储,例如使用Redis设置有效期
        // 发送验证码到用户邮箱
        emailService.sendResetCode(user.getEmail(), resetCode);
        return ResponseEntity.ok("Verification code sent successfully.");
    } else {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Email not found.");
    }
}

(2) 用户提交验证码及新密码

在前端,创建一个表单让用户输入收到的验证码和新密码。提交表单后,调用后端接口验证验证码并更新密码。

<template>
  <!-- ... -->
  <div class="reset-password">
    <h3>Reset Password</h3>
    <form @submit.prevent="resetPassword">
      <div class="form-group">
        <label for="resetCode">Verification Code</label>
        <input type="text" v-model="resetForm.resetCode" id="resetCode" required />
      </div>
      <div class="form-group">
        <label for="newPassword">New Password</label>
        <input type="password" v-model="resetForm.newPassword" id="newPassword" required />
      </div>
      <button type="submit">Reset Password</button>
    </form>
  </div>
  <!-- ... -->
</template>

<script>
export default {
  // ...
  data() {
    return {
      resetForm: {
        resetCode: "",
        newPassword: "",
      },
    };
  },
  methods: {
    async resetPassword() {
      try {
        await this.$http.post("/user/reset-password", this.resetForm);
        // Handle success
      } catch (error) {
        // Handle error
      }
    },
  },
};
</script>

在后端,创建一个处理重置密码请求的接口。首先,验证用户提交的验证码是否正确。如果验证通过,则使用加密工具更新用户的密码。

@PostMapping("/reset-password")
public ResponseEntity<?> resetPassword(@Valid @RequestBody ResetPasswordForm resetPasswordForm) {
    // 根据提交的验证码在存储中查找关联的用户
    User user = findUserByResetCode(resetPasswordForm.getResetCode());
    if (user != null) {
        // 更新用户密码
        user.setPassword(bCryptPasswordEncoder.encode(resetPasswordForm.getNewPassword()));
        userRepository.save(user);
        // 清除验证码
        removeResetCode(resetPasswordForm.getResetCode());
        return ResponseEntity.ok("Password reset successfully.");
    } else {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid verification code.");
    }
}

通过以上代码,我们实现了修改密码与找回密码的功能。在实际项目中,可以根据需求和场景进行适当调整,以提高用户体验和安全性。

在找回密码功能中,除了前端表单的输入提示和后端对用户提交信息的验证,我们还可以加入以下额外的安全措施和用户体验优化。

1.增强验证码的安全性

在发送验证码时,可以采用一定的算法生成随机验证码,以增加破解难度。同时,可以结合图片验证码或滑动验证码等技术,防止机器人恶意攻击。

2.限制验证码发送次数

为了防止用户恶意请求验证码或尝试暴力破解,可以在后端限制发送验证码的频率和次数。例如,每分钟只允许发送一次验证码,每天最多发送5次。

3.验证码失效策略

设置验证码的有效期,如5分钟或10分钟后过期,提高安全性。同时,在用户尝试使用过期验证码时,给出友好的提示信息,引导用户重新获取验证码。

4.用户操作反馈

在用户操作过程中,通过前端提示框或消息通知形式,给予用户明确的反馈,如“验证码发送成功,请注意查收”、“验证码错误,请重新输入”等。这样可以提高用户体验,让用户明确当前操作的状态。

5.关联已登录用户

对于已登录用户,可以在个人资料页面直接提供修改密码入口,而无需重新进行找回密码操作。这样既简化了操作流程,也提高了用户体验。

综上所述,通过对修改密码和找回密码功能的优化和补充,可以有效提高用户体验和系统安全性。在实际项目中,开发者可以根据实际需求和场景进行调整和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查询优化器:选择最优的查询路径

当我们通过解析器理解了SQL语句要干什么之后&#xff0c;接着会找查询优化器&#xff08;Optimizer&#xff09;来选择一个最优的查询路径。 可能有同学这里就不太理解什么是最优的查询路径了&#xff0c;这个看起来确实很抽象&#xff0c;当然&#xff0c;这个查询优化器的工…

总结819

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 第二周&#xff1a; 学习内容&#xff1a; 暴力英语&#xff1a;早上背诵《think different》记150词&#xff0c;默写了两篇文章&#xff0c…

BUUCTF-warmup_csaw_2016

1.checksec/file 64位的linux文件 2.ida 找到主函数 发现致命函数 get() 因为get可以无限输入 看看有没有什么函数我们可以返回的 双击进入sub_40060d 直接发现这个函数是取flag的 所以我们开始看这个函数的地址 所以函数地址是 0x40060d 我们看看get什么时候开始的 发现g…

Stable Diffusion复现——基于 Amazon SageMaker 搭建文本生成图像模型

众所周知&#xff0c;Stable Diffusion扩散模型的训练和推理非常消耗显卡资源&#xff0c;我之前也是因为资源原因一直没有复现成功。而最近我在网上搜索发现&#xff0c;亚马逊云科技最近推出了一个【云上探索实验室】刚好有复现Stable Diffusion的活动&#xff0c;其使用亚马…

超详细从入门到精通,pytest自动化测试框架实战-fixture高级进阶(十)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 1、fixture的autous…

jQuery+AJAX技术(简单的用户注册功能)

目录1、jQuery是什么&#xff1f;2、AJAX是什么&#xff1f;3、jQuery与AJAX的关系&#xff1f;使用jQuery实现AJAX示例&#xff1a;4、jQueryAJAX技术实现用户注册验证功能。1、jQuery是什么&#xff1f; jQuery 是一个快速&#xff0c;小型且功能丰富的JavaScript库。它使 诸…

gradle编译项目报错Execution failed for task ‘:bootJar‘,‘:mainClass‘,‘:compileJava‘.

目录1.问题2.问题查找3.更多1.问题 idea导入Gradle管理的SpeingBoot多模块项目&#xff0c;依赖下载不下来&#xff0c;执行编译报错 报错信息&#xff1a; 2.问题查找 首先怀疑是不是idea的版本与gradle版本冲突&#xff0c;我用的是idea2022.3.3&#xff0c;gradle是7.5.…

做一个内心强大的人

想想类似如下这种心灵鸡汤&#xff0c;本不太愿意在这个平台发布&#xff0c;但是偶尔喝点又何尝不可&#xff01; 语录摘抄/分享&#xff1a; 1、你开始炫耀自己&#xff0c;往往都是灾难的开始&#xff0c;就像老子在《道德经》里写到: 光而不耀&#xff0c;静水流深。 2、…

汽车电子相关术语介绍

一、相关术语介绍 1、汽车OTA 全称“Over-The-Air technology ”&#xff0c;即空中下载技术&#xff0c;通过移动通信的接口实现对软件进行远程管理&#xff0c;传统的做法到4S店通过整车OBD对相应的ECU进行软件升级。OTA技术最早2000年出现在日本&#xff0c;目前通过OTA方式…

HashMap源码解析超详细

HashMap源码详解1、概述2、源码解析1.HashMap底层存储结构问题一: 为什么直接就用数组呢&#xff1f;问题二&#xff1a;什么是红黑树呢&#xff1f;问题三&#xff1a;为什么不一下子把整个链表变为红黑树呢&#xff1f;2.HashMap的重要成员变量3.构造方法解析4.Put方法解析取…

渗透测试工具库-收藏版

1.前言 浩二一开始做渗透测试的时候收集超多的资料和工具&#xff0c;一直在文档里吃灰。今天全部放出来分享给大家&#xff0c;需要的自己收藏。 2.漏洞练习平台 WebGoat漏洞练习平台&#xff1a; https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: http…

好程序员:Java书籍推荐,程序员必看的5本Java书籍,赶紧收藏!

今天好程序员给大家推荐5本Java书籍&#xff0c;各大高校都在使用&#xff08;具体名单如下&#xff09;&#xff0c;所有学习Java的程序员都不应该错过&#xff01; 第一本Java书籍《Java EE&#xff08;SSM框架&#xff09;企业应用实战》 本书全面介绍了JavaEE中MyBatis、Sp…

ChatGLM-6B论文代码笔记

ChatGLM-6B 文章目录ChatGLM-6B前言一、原理1.1 优势1.2 实验1.3 特点&#xff1a;1.4 相关知识点二、实验2.1 环境基础2.2 构建环境2.3 安装依赖2.4 运行2.5 数据2.6 构建前端页面3 总结前言 Github&#xff1a;https://github.com/THUDM/ChatGLM-6B 参考链接&#xff1a; ht…

“QT 快速上手指南“ 之 计算器(二)

文章目录前言一、QT 基本组件用法介绍&#xff1a;1. QLabel &#xff1a;2. QPushButton :3. QLineEdit:二、坐标系统三、窗口部件的大小设置1. setSize( ) 函数&#xff1a;2. resize( )函数&#xff1a;3. setFixedSize( )函数:4. setFixedWidth( ) 和 setFixedHeight( )函数…

大一被忽悠进了培训班

大家好&#xff0c;我是帅地。 最近我的知识星球开始营业&#xff0c;不少大一大二的小伙伴也是纷纷加入了星球&#xff0c;并且咨询的问题也是五花八门&#xff0c;反正就是&#xff0c;各种迷茫&#xff0c;其中有一个学弟&#xff0c;才大一&#xff0c;就报考培训班&#…

命令注入概述

概述命令注入即 Command Injection。是指在开发需求中&#xff0c;需要调用一些系统的命令来完成某些特定的功能。当未对用户输入的参数进行严格的过滤时&#xff0c;则有可能发生命令注入。攻击者可以通过提交恶意构造的参数破坏命令语句结构&#xff0c;从而达到执行恶意命令…

九大经典算法

1. 冒泡排序&#xff08;Bubble Sort&#xff09; 两个数比较大小&#xff0c;通过两两交换&#xff0c;像水中的泡泡一样&#xff0c;较大的数下沉&#xff0c;较小的数冒起来。 算法描述&#xff1a; 1.比较相邻的元素。如果第一个比第二个大&#xff0c;就交换它们两个&a…

界面组件DevExtreme v22.2 - Pivot Grid、UI组件升级

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

【Golang入门】简介与基本语法学习

下面是一篇关于Golang新手入门的博客&#xff0c;记录一下。&#xff08;如果有语言基础基本可以1小时入门&#xff09; 一、什么是Golang&#xff1f; Golang&#xff08;又称Go&#xff09;是一种由谷歌公司开发的编程语言。它是一种静态类型、编译型、并发型语言&#xff0…

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala 前言 【本文适合有一定计算机基础/半年工作经验的读者食用。立个Flg&#xff0c;愿天下不再有肤浅的SQL Boy】 谈到大数据开发&#xff0c;占据绝大多数人口的就是SQL Boy&#xff0c;不接受反驳&#xff0c;毕竟大…