基于session注冊JAva篇springboot

springboot3全家桶,數據庫 :redis,mysql

背景環境:郵箱驗證碼,驗證注冊?

流程:先通過郵箱驗證,發送驗證碼,將獲取到的session和驗證碼,存入redis里(發送郵箱)

在pop添加
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

@Resource

StringRedisTemplate template;有了上面的框架就可以直接調用

server服務層

發送郵件impl實現層代碼

    @Overridepublic String sendValidateEmail(String email, String session) {//數據搬運工,將key搬運來String key = "email:" + session + ":" + email;//處理數據,深加工,if (Boolean.TRUE.equals(template.hasKey(key))) {Long expire = Optional.ofNullable(template.getExpire(key, TimeUnit.SECONDS)).orElse(0L);if (expire > 120)return "請稍后再試!";}Random random = new Random();int code = random.nextInt(899999) + 10000;SimpleMailMessage simpleMailMessage = new SimpleMailMessage();simpleMailMessage.setFrom("yanxin_ru@163.com");simpleMailMessage.setTo(email);simpleMailMessage.setSubject("您的安全驗證郵件");simpleMailMessage.setText("驗證碼:" + code);try {mailSender.send(simpleMailMessage);template.opsForValue().set(key, String.valueOf(code), 3, TimeUnit.MINUTES);return "發送成功";} catch (MailException e) {e.printStackTrace();return "發送失敗";}}

注冊實現

  @Overridepublic String addValidateUser(String username, String password, String email, String code, String session) {String key = "email:" + session + ":" + email;if (Boolean.TRUE.equals(template.hasKey(key))) {int i = mapping.userByAdmitOREmail(email).getId();if (i >= 3){return "郵箱注冊上限!(3)";}String s = template.opsForValue().get(key);if (s == null) return "驗證碼失效,請重新獲得驗證碼";if (Objects.equals(s, code)) {String encode = new BCryptPasswordEncoder().encode(password);if (mapping.addUser(username, encode, email) > 0) {return null;} else {return "系統問題,請聯系管理員";}} else {return "驗證碼錯誤,請重新輸入驗證碼";}} else return "請先獲取驗證碼,感謝配合!";}

每次成功發送郵箱,就會運行這條

template.opsForValue().set(key, String.valueOf(code), 3, TimeUnit.MINUTES);

在redis存儲一條key+email+session

注冊功能會失敗的情況下目前所知道的有三種!!!

在說問題前,最重要的是這條代碼Boolean.TRUE.equals(template.hasKey(key))

如果我們郵箱發送成功了,那么redis里是能查到數據的

看兩這個是一樣的,理論情況

第一情況

當我們的session不同時,那么這個代碼一直就返回這條請先獲取驗證碼,感謝配合!

為什么會造成這個?

因為:前端發送的session和我們存儲的session不同導致的,兩者客戶端不同所導致的!

啊!我前端后端在一起為什么會出現這個問題!

很簡單,127.0.0.1本地連接,localhost本地連接,按道理這兩個是一樣的啊!

錯錯,大錯特錯,這兩個是不一樣的!,別問,問就是不知道,具體的細節是不知道的,但是知道的localhost在使用時會轉換成127.0.0.1,這就是核心,他會轉換成127.0.0.1,這個可奇妙了!

所以前端使用127.0.0.1,那么后端也要127.0.0.1,兩者保持一致,就可以解決前端發送的session和我們存儲在rdis的session不同

同理,后端使用localhost那么前端也用

第二情況

Objects.equals(s, code)判斷問題,字符串判斷要用equals

第三情況

mapping.addUser(username, encode, email) > 0

我們使用了spring surety,如果傳進數據庫的不是加密的密碼,這個會導致后續登錄出現問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【leetcode】鏈表的回文結構

大家好&#xff0c;我是蘇貝&#xff0c;本篇博客帶大家刷題&#xff0c;如果你覺得我寫的還不錯的話&#xff0c;可以給我一個贊&#x1f44d;嗎&#xff0c;感謝?? 點擊查看題目 思路: 1.找中間節點 找中間節點的方法在下面這個博文中詳細提過 【點擊進入&#xff1a;【l…

鴻蒙Harmony應用開發—ArkTS聲明式開發(通用屬性:布局約束)

通過組件的寬高比和顯示優先級約束組件顯示效果。 說明&#xff1a; 從API Version 7開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。 aspectRatio aspectRatio(value: number) 指定當前組件的寬高比。 卡片能力&#xff1a; 從API vers…

springboot /tmp 臨時目錄

文章目錄 1.生成機制2.產生異常3.解決辦法3.1 重啟大法3.1 從Linux層面修改 /tmp目錄的清理策略3.2 增加JVM配置3.3 增加JVM配置3.4 添加spring boot配置3.5 使用配置類配置 1.生成機制 在linux系統中&#xff0c;springboot應用服務再啟動&#xff08;java -jar 命令啟動服務…

淺談 Linux 孤兒進程和僵尸進程

文章目錄 前言孤兒進程僵尸進程 前言 本文介紹 Linux 中的 孤兒進程 和 僵尸進程。 孤兒進程 在 Linux 中&#xff0c;就是父進程已經結束了&#xff0c;但是子進程還在運行&#xff0c;這個子進程就被稱作 孤兒進程。 需要注意兩點&#xff1a; 孤兒進程最終會進入孤兒院…

一篇Sora模型小白掃盲文——《Sora技術報告》總結

Sora技術報告的核心總結 根據目前公開的一些信息,我個人將Sora技術報告一文中的核心內容總結如下,分別為訓練過程的開創性優化技術、模型支持的能力、模型的缺陷。 一、訓練過程開創性優化技術 1.ChatGPT的分詞(token)處理取得了很好的一致性文本處理能力,Sora也借鑒了這…

勒索病毒普通用戶防范建議

勒索病毒普通用戶防范建議 定期備份存儲在計算機上的數據&#xff0c;這樣勒索軟件感染不會永遠破壞您的個人數據。 最好創建兩個備份副本&#xff1a;一個存儲在云中&#xff08;記住使用一個自動備份文件的服務&#xff09;&#xff0c;另一個物理存儲&#xff08;便攜式硬…

軟考-計算題

1.二維矩陣轉換成一維矩陣 2.算術表達式&#xff1a; 3.計算完成項目的最少時間&#xff1a;之前和的max&#xff08;必須之前的所有環節都完成&#xff09; 松弛時間&#xff1a;最晚開始時間-最早開始時間 最早&#xff1a;之前環節都完成的和的max 最晚&#xff1a;總時間…

基于區塊鏈技術的物聯網設備影子服務

一&#xff0e; 背景 物聯網設備影子是指真實的物聯網設備在物聯網平臺中對應的虛擬設備&#xff0c;設備影子服務存儲了對應物理設備的當前數據。用戶使用物聯網設備的實時數據都是從物聯網設備影子服務獲取&#xff0c;如果設備影子服務的數據被修改&#xff0c;就容易導致…

黑貓的牌面

解法&#xff1a; 桶 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \nint main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);vector<int> tong(1001);int t 4;int k, pai;long lon…

LeetCode 每日一題 樹合集 Day 16 - 27

終于是開學了&#xff0c;想了想每日一更頻率太高&#xff0c;以后每周更新一周的每日一題。 103. 二叉樹的鋸齒形層序遍歷 給你二叉樹的根節點 root &#xff0c;返回其節點值的 鋸齒形層序遍歷 。&#xff08;即先從左往右&#xff0c;再從右往左進行下一層遍歷&#xff0c…

探索網絡通信與序列化:打造現代Web應用的基石20240227

在構建現代Web應用的過程中&#xff0c;理解網絡通信協議與數據序列化技術的基本概念至關重要。這些技術不僅是網絡世界的基礎設施&#xff0c;而且也是開發者設計和實現高效、可靠應用的關鍵工具。本文旨在深入淺出地介紹這些概念&#xff0c;幫助開發者更好地掌握構建Web應用…

嵌入式開發——面試題操作系統(調度算法)

linux7種進程調度算法 1&#xff1a;先來先服務&#xff08;FCFS&#xff09;調度算法 原理&#xff1a;按照進程進入就緒隊列的先后次序進行選擇。對于進程調度來說&#xff0c;一旦一個進程得到處理機會&#xff0c;它就一直運行下去&#xff0c;直到該進程完成任務或者因等…

阿里云降價,這潑天的富貴你接不接?附云服務器價格表

阿里云能處&#xff0c;關鍵時刻ta真降價啊&#xff01;2024新年伊始阿里云帶頭降價了&#xff0c;不只是云服務器&#xff0c;云數據庫和存儲產品都降價&#xff0c;阿里云新老用戶均可購買99元服務器、199元服務器&#xff0c;續費不漲價&#xff0c;阿里云百科aliyunbaike.c…

智能指針(Smart Pointers)

定義 智能指針&#xff08;Smart Pointers&#xff09;是C中的一種高級特性&#xff0c;它提供了一種自動管理動態分配內存的機制。通過智能指針&#xff0c;開發者可以避免手動管理內存所帶來的問題&#xff0c;如內存泄漏和懸掛指針等。智能指針的主要目的是確保當對象不再需…

【力扣hot100】刷題筆記Day17

前言 今天竟然不用開組會&#xff01;天大的好消息&#xff0c;安心刷題了 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯&#xff08;排列&#xff09; class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…

C++學習第四天(類與對象下)

1、構造函數的其他知識 構造函數體賦值 在創建對象時&#xff0c;編譯器通過調用構造函數&#xff0c;給對象中各個成員變量一個合適的初始值 構造函數調用之后&#xff0c;對象中已經有了一個初始值&#xff0c;但是不能將其稱為對對象中成員變量的初始化&#xff0c;構造函…

Nginx+keepalived 高可用高性能

什么是高可用: 在使用 Nginx 做反向代理或者負載均衡的時候,都是以 Nginx 為入口,如果 Nginx 宕機了,那么所有的服務都無法正常提供,影響非常嚴重。所有我們需要保證 nginx 高可用,就是配置備份機,前一個掛了,還有后一個。 為了避免負載均衡服務器宕機造成嚴重影響,…

關于游戲報錯提示x3daudio1_7.dll丟失怎么修復?多個實測有效方法分享

x3daudio1_7.dll 是一個與 Microsoft DirectX 相關的重要動態鏈接庫&#xff08;DLL&#xff09;文件&#xff0c;它主要服務于Windows操作系統下的多媒體和游戲應用程序。 一、以下是關于 x3daudio1_7.dll 文件的詳細介紹 名稱與位置&#xff1a; 文件名&#xff1a;x3daud…

PHP堆棧+errLog定位

調用堆棧&#xff08;Call Stack&#xff09;是一個記錄了程序在運行時所有活動子例程的棧結構。它以函數調用的方式描述了程序的執行流程和調用關系。 在PHP中&#xff0c;我們可以通過打印PHP調用堆棧來輔助調試和定位代碼中的問題。本文將介紹如何在PHP中打印調用堆棧&…

探秘Python的Pipeline魔法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站AI學習網站。 目錄 前言 什么是Pipeline&#xff1f; Pipeline的基本用法 Pipeline的高級用法 1. 動態調參 2. 并行處理 3. 多輸出 …