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.pswp.cn/news/902096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902096.shtml
英文地址,請注明出處:http://en.pswp.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…