java怎么完善注册,如果邮箱中途更换,能否判断

解析在下面

附赠代码

    private static class CodeInfo {String code;long timestamp;CodeInfo(String code, long timestamp) {this.code = code;this.timestamp = timestamp;}}
// 存储验证码(邮箱 -> 验证码信息)(保证线程安全)   以免中途更改邮箱private static final ConcurrentHashMap<String, CodeInfo> codeMap = new ConcurrentHashMap<>();
      String email = request.getEmail();// 检查邮箱是否发送过验证码if (!codeMap.containsKey(email)) {response = "EMAIL_CHANGED"; // 邮箱被更改或未发送验证码break;}

分步解析:如何完善注册逻辑以检测邮箱中途更换


1. 核心逻辑设计
• 目标:确保用户注册时使用的邮箱必须与发送验证码的邮箱一致,防止中途篡改。

• 关键机制:

• 使用 ConcurrentHashMap<String, CodeInfo> 存储 邮箱 → 验证码信息。

• 注册时检查提交的邮箱是否已发送过验证码(存在于 codeMap 中)。

• 若邮箱未发送过验证码或已被更换,返回明确错误码 EMAIL_CHANGED


2. 关键代码解析
2.1 验证码存储结构

private static final ConcurrentHashMap<String, CodeInfo> codeMap = new ConcurrentHashMap<>();

• 键(Key):用户邮箱(唯一标识)。

• 值(Value):CodeInfo 对象,包含验证码和生成时间戳。

• 线程安全:ConcurrentHashMap 确保多线程环境下的安全访问。

2.2 发送验证码逻辑(Case 4)

case 4:String email = request.getEmail();String code = handleSendRegisterCode(request); // 生成并发送验证码codeMap.put(email, new CodeInfo(code, System.currentTimeMillis())); // 存储邮箱与验证码response = "验证码发送成功";break;

• 行为:用户请求发送验证码时,将邮箱和验证码存入 codeMap

• 防篡改:后续注册必须使用同一邮箱提交验证码。

2.3 注册逻辑(Case 2)

case 2:String email = request.getEmail();String inputCode = request.getVerification();// 检查邮箱是否发送过验证码if (!codeMap.containsKey(email)) {response = "EMAIL_CHANGED"; // 邮箱被中途更换或未发送验证码break;}// 验证验证码是否正确或过期if (!validateCode(email, inputCode)) {response = "验证码错误或已过期";break;}// 执行注册...break;

• 关键检查:codeMap.containsKey(email) 确保注册邮箱必须与发送验证码的邮箱一致。

• 错误处理:若邮箱不一致,返回 EMAIL_CHANGED


3. 验证码验证方法

private boolean validateCode(String email, String inputCode) {CodeInfo storedInfo = codeMap.get(email);if (storedInfo == null) return false; // 邮箱未发送过验证码boolean expired = (System.currentTimeMillis() - storedInfo.timestamp) > 300_000; // 5分钟过期boolean valid = storedInfo.code.equalsIgnoreCase(inputCode); // 不区分大小写if (valid) codeMap.remove(email); // 验证成功移除记录return !expired && valid;
}

• 行为:

• 检查验证码是否过期(5分钟)。

• 检查验证码是否匹配。

• 验证成功后移除记录,防止重复使用。


4. 防止中途更换邮箱的流程

  1. 用户操作:
    • 输入邮箱 A → 发送验证码 → 后端存储 A → CodeInfo。 • 修改邮箱为 B → 直接提交注册(未重新发送验证码)。
  2. 后端检测:
    • 注册时检查 codeMap.containsKey(B) → 不存在。 • 返回错误码 EMAIL_CHANGED
  3. 前端提示:
else if ("EMAIL_CHANGED".equals(response)) {showErrorAlert("检测到邮箱已更改,请重新获取验证码");
}

5. 测试场景验证

场景后端行为前端提示
用户未发送验证码直接注册codeMap 无记录 → 返回 EMAIL_CHANGED“检测到邮箱已更改,请重新获取验证码”
用户发送验证码后更改邮箱未重发新邮箱不在 codeMap → 返回 EMAIL_CHANGED“检测到邮箱已更改,请重新获取验证码”
用户发送验证码后未更改邮箱邮箱存在于 codeMap → 继续验证码检查 → 注册成功“注册成功”

6. 潜在问题与优化

  1. 问题:用户可能通过并发请求绕过验证码发送限制。
    优化:在发送验证码时增加频率限制(如1分钟内同一邮箱只能发送一次)。
  2. 问题:codeMap 在分布式环境下无法共享。
    优化:改用 Redis 存储验证码,支持分布式和自动过期。
  3. 问题:前端未正确传递邮箱参数。
    调试:添加日志输出,确认后端收到的邮箱与发送验证码时一致。

7. 最终总结
• 完善逻辑:通过 codeMap 的键绑定和注册时的邮箱检查,有效防止中途更换邮箱。

• 错误处理:明确返回 EMAIL_CHANGED,提升用户体验。

• 扩展性:当前方案适用于单机环境,分布式场景需升级存储方案。

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

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

相关文章

n8n 中文系列教程_01. 简单易懂的现代AI魔法,n8n的快速了解与概念科普(文末有彩蛋)

1. 教程简介 欢迎来到“无代码工具探索”课程&#xff0c;这是专为非技术人员设计的指南&#xff08;当然&#xff0c;技术人员也可以从中受益&#xff09;。我们的目标是通过无代码工具来提升工作效率&#xff0c;尤其是利用像 n8n 这样的灵活数据库平台。这些工具被誉为“现…

解码 Web Service:从技术原理到应用场景的深度剖析

Web Service 是一种基于网络的、分布式的计算技术&#xff0c;它允许不同的应用程序之间通过网络进行通信和交互。以下是关于 Web Service 的详细介绍&#xff1a; 一、定义与概念 Web Service 是一种可以通过 Web 协议&#xff08;如 HTTP&#xff09;进行访问的软件组件&am…

Nacos启动报错

Nacos启动是在单机模式下&#xff0c;不是集群模式 点击startup.cmd启动会报错 打开bin目录 rem是注释的意思&#xff0c;在nacos1.3.2之后&#xff0c;nacos默认的都是集群模式&#xff0c;我们这里单机测试就是用单机模式。 也可以修改MODE&#xff0c;如果选择不修改&…

uniapp-商城-26-vuex 使用流程

为了能在所有的页面都实现状态管理&#xff0c;我们按照前面讲的页面进行状态获取&#xff0c;然后再进行页面设置和布局&#xff0c;那就是重复工作&#xff0c;vuex 就会解决这样的问题&#xff0c;如同类、高度提炼的接口来帮助我们实现这些重复工作的管理。避免一直在造一样…

Git 命令速查手册

听说用美图可以钓读者&#xff1f; 一、基础操作核心命令 1. 仓库初始化与克隆 命令作用示例git init创建新仓库git init my-projectgit clone克隆远程仓库git clone [https://github.com/user/repo.git](https://github.com/user/repo.git)git remote add关联远程仓库git re…

信息量、香农熵、交叉熵、KL散度总结

信息量 对于一个事件而言&#xff0c;它一般具有三个特征&#xff1a; 小概率事件往往具有较大的信息量 大概率事件往往具有较小的信息量 独立事件的信息量相互可以相加 比如我们在买彩票这个事件中&#xff0c;彩票未中奖的概率往往很高&#xff0c;对我们而言一点也不稀…

使用C语言的cJSON中给JSON字符串添加转义

在 cJSON 库中&#xff0c;没有直接提供 一个函数来专门给 JSON 字符串添加转义&#xff08;如将 " 转义为 \"&#xff0c;\n 转义为 \\n 等&#xff09;。 但 cJSON 在 序列化&#xff08;cJSON_Print 或 cJSON_PrintUnformatted&#xff09; 时会自动处理转义字符…

宇树机器狗go2—slam建图(1)点云格式

0.前言 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动&#xff0c;本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式&#xff0c;在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道…

linux socket编程之udp(实现客户端和服务端消息的发送和接收)

目录 一.创建socket套接字(服务器端) 二.bind将prot与端口号进行绑定(服务器端) 2.1填充sockaddr_in结构 2.2bind绑定端口 三.直接通信(服务器端) 3.1接收客户端发送的消息 3.2给客户端发送消息 四.客户端通信 4.1创建socket套接字 4.2客户端bind问题 4.3直接通信即可…

第1期:Python基础语法入门

1.1 Python简介 Python是一种解释型、面向对象、动态数据类型的高级编程语言。它设计简洁&#xff0c;易于学习&#xff0c;适合初学者。Python广泛应用于数据科学、人工智能、Web开发、自动化脚本等领域。它的语法简洁易懂&#xff0c;强调代码的可读性。 1.2 安装Python与配…

使用EXCEL绘制平滑曲线

播主播主&#xff0c;你都多少天没更新了&#xff01;&#xff01;&#xff01;泥在干什么&#xff1f;你还做这个账号麻&#xff1f;&#xff01;&#xff01;&#xff01; 做的做的&#xff08;哭唧唧&#xff09;&#xff0c;就是最近有些忙&#xff0c;以及…… 前言&…

当算力遇上马拉松:一场科技与肉身的极限碰撞

目录 一、从"肉身苦修"到"科技修仙" 二、马拉松的"新大陆战争" 三、肉身会被算法"优化"吗? 马拉松的下一站是"人机共生"时代 当AI能预测你的马拉松成绩,算法能规划最佳补给方案,智能装备让训练效率翻倍——你还会用传…

MLLMs for TSAD ?

项目链接:Multimodal LLMs Advance Time Series Analysis 代码链接:https://github.com/mllm-ts/VisualTimeAnomaly 出处:ICLR 2025 一 文章动机 多模态 LLM (MLLM) 通过 “视觉” 方式处理时序的潜力仍未充分探索; 人类检测 “时序异常” 的自然方式:可视化、文本描…

开发基于python的商品推荐系统,前端框架和后端框架的选择比较

开发一个基于Python的商品推荐系统时&#xff0c;前端和后端框架的选择需要综合考虑项目需求、开发效率、团队熟悉度以及系统的可扩展性等因素。 以下是一些推荐的框架和建议&#xff1a; 后端框架 Flask 优点&#xff1a; 轻量级&#xff1a;Flask的核心非常简洁&#xff0c;…

chili3d调试笔记2+添加web ui按钮

onclick 查找 打个断点看看 挺可疑的&#xff0c;打个断点看看 挺可疑的&#xff0c;打个断点看看 打到事件监听上了 加ui了 加入成功 新建弹窗-------------------------------------- 可以模仿这个文件&#xff0c;写弹窗 然后在这里注册一下&#xff0c;外部就能调用了 对了…

【重学Android】1.关于@Composer注解的一点知识笔记

最新因为一些原因&#xff0c;开始重新学习Android及kotlin编程&#xff0c;也觉得可以顺带记录下这个过程中的一些知识点&#xff0c;也可以用作日后自己查找复习。 Composable 注解在 Android 开发中的使用 Composable 是 Jetpack Compose&#xff08;Android 的现代声明式…

qt+mingw64+cmake+libqrencode项目编译和搭建成功记录

最近要使用高拍仪拍照获取照片&#xff0c;然后识别照片中的二维码数据、使用QZxing只能识别出一个条码、另外一个条码准备测试用其他的开源项目&#xff08;如libqrencode-4.1.1&#xff09;来进行测试&#xff0c;故进行本文的项目环境搭建测试&#xff0c;最后成功。 本机开…

【今日三题】判断是不是平衡二叉树(递归) / 最大子矩阵(二维前缀和) / 小葱的01串(滑动窗口)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 判断是不是平衡二叉树(递归)最大子矩阵(二维前缀和)小葱的01串(滑动窗口) 判断是不是平衡二叉树(递归) 判断是不是平衡二叉…

【Linux】线程ID、线程管理、与线程互斥

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 上篇文章&#xff1a; 【Linux】线程&#xff1a;从原理到实战&#xff0c;全面掌握多线程编程&#xff01;-CSDN博客 下…

定制一款国密浏览器(10):移植SM2算法前,解决错误码的定义问题

上一章中,我给大家介绍了 SM4 在 BoringSSL 上的移植要点,本来计划本章介绍 SM2 算法的移植要点。在移植 SM2 过程中,遇到了一个拦路虎,所以先扫除这个拦路虎,这就是错误码的定义问题。 在铜锁中,引入了几个错误码和错误字符串,在文件 sm2_err.c 中: static const ER…