電商秒殺系統-案例04-redis下的session控制

前言:
在現代的Web應用中,安全和高效的用戶身份驗證機制是至關重要的。本文將深入探討基于令牌的用戶登錄會話機制,特別是在使用Redis進行會話管理的情景。通過這一案例實戰,我們將了解令牌如何在用戶身份驗證過程中發揮核心作用,并確保用戶會話的安全性和有效性。

令牌檢查與Redis驗證

用戶平時會訪問我們的系統,在處理任何一個請求之前,必須檢查一下,這個請求是否帶上了一個令牌。如果帶了一個令牌,那么此時就必須在Redis里檢查一下,這個令牌是否有在Redis里合法的、有效的一個session會話。如果有這個session會話,此時就可以允許這個請求被處理,因為說明這個人之前已經登錄過我們的系統了,登錄過后才會在Redis里放一個有效的session會話;如果說沒有這個session的話,此時就會導致用戶必須強制被迫登錄。

用戶登錄與令牌發放

如果用戶登錄通過之后,就會返回給瀏覽器或者客戶端一塊令牌,同時在Redis里初始化好一個session會話。后續客戶端就會在指定時間范圍內發送請求的時候帶上一塊令牌,每次令牌和服務器端的session校驗通過就可以執行請求。

令牌過期與強制登錄

過一段時間過后,服務端的Redis里的session會話就會過期。過期了之后,又會導致你必須要重新登錄,雖然你可能帶上了令牌,但是一檢查發現這塊令牌對應的Redis里的session已經過期了。

Redis命令操作

hset把用戶id和令牌存儲一下,hset把用戶id和過期令牌過期時間存儲一下。每次訪問系統都讓用戶帶上令牌,如果令牌不存在就是沒登錄,hget獲取存儲的令牌和過期時間,如果令牌過期了也要強制登錄,如果令牌校驗通過,這次請求就可以通過。如果令牌要是過期了,就用hdel把存儲的令牌和過期時間都刪了。

代碼:

package com.example.session;import redis.clients.jedis.Jedis;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.UUID;/*** 示例:用戶會話管理*/
public class UserSessionManager {private Jedis redisClient = new Jedis("127.0.0.1");/*** 驗證會話是否有效* @param sessionToken 會話令牌* @return 有效性*/public boolean checkSessionValidity(String sessionToken) throws Exception {if(sessionToken == null || sessionToken.isEmpty()) {return false;}String sessionData = redisClient.hget("user_sessions", "session_token:" + sessionToken);if(sessionData == null || sessionData.isEmpty()) {return false;}String sessionExpiry = redisClient.hget("session_expiration_times", "session_token:" + sessionToken);if(sessionExpiry == null || sessionExpiry.isEmpty()) {return false;}SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date sessionExpiryDate = dateFormat.parse(sessionExpiry);if(new Date().after(sessionExpiryDate)) {return false;}return true;}/*** 用戶登錄* @param user 用戶名* @param pass 密碼* @return 會話令牌*/public String loginUser(String user, String pass) {System.out.println("登錄用戶:" + user + ", 密碼:" + pass);long userId = new Random().nextInt(100000);String token = UUID.randomUUID().toString().replace("-", "");initializeSession(userId, token);return token;}/*** 初始化用戶會話* @param userId 用戶ID* @param token 會話令牌*/public void initializeSession(long userId, String token) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar calendar = Calendar.getInstance();calendar.add(Calendar.HOUR, 24);String sessionExpiry = dateFormat.format(calendar.getTime());redisClient.hset("user_sessions", "session_token:" + token, String.valueOf(userId));redisClient.hset("session_expiration_times", "session_token:" + token, sessionExpiry);}public static void main(String[] args) throws Exception {UserSessionManager sessionManager = new UserSessionManager();boolean isValid = sessionManager.checkSessionValidity(null);System.out.println("初次訪問,會話驗證:" + (isValid ? "通過" : "不通過"));String sessionToken = sessionManager.loginUser("alice","password123");System.out.println("登錄后獲得令牌:" + sessionToken);isValid = sessionManager.checkSessionValidity(sessionToken);System.out.println("再次訪問,會話驗證:" + (isValid ? "通過" : "不通過"));}
}

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

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

相關文章

Linux dircolors命令教程:如何設置ls命令的顏色方案(附案例詳解和注意事項)

Linux dircolors命令介紹 dircolors命令在Linux中用于設置ls命令顯示文件和目錄的顏色方案。它可以輸出設置LS_COLORS環境變量的命令。 Linux dircolors命令適用的Linux版本 dircolors命令在大多數Linux發行版中都可用,包括Debian、Ubuntu、Alpine、Arch Linux、…

C++ | Leetcode C++題解之第85題最大矩形

題目&#xff1a; 題解&#xff1a; class Solution { public:int maximalRectangle(vector<vector<char>>& matrix) {int m matrix.size();if (m 0) {return 0;}int n matrix[0].size();vector<vector<int>> left(m, vector<int>(n, 0)…

【HCIP學習】BGP對等體組、聚合、路由反射器、聯盟、團體屬性

一、大規模BGP網絡所遇到的問題 BGP對等體眾多&#xff0c;配置繁瑣&#xff0c;維護管理難度大 BGP路由表龐大&#xff0c;對設備性能提出挑戰 IBGP全連接&#xff0c;應用和管理BGP難度增加&#xff0c;鄰居數量過多 路由變化頻繁&#xff0c;導致路由更新頻繁 二、解決大…

使用QT-QSqlQuery::value()遇到的問題

在實現客戶端間好友添加功能時&#xff0c;我通過以下函數想實現數據庫對好友信息的保存 bool OpeDB::handleAddFriend_repound(const char *pername, const char *name) { // pername 被添加方 name 申請添加方 qDebug() << pername << " " &l…

Nginx(簡潔版)

基本配置 worker_processes 1; //默認為1&#xff0c;表示開啟一個業務進程 events //事件驅動模塊&#xff08;&#xff09;{worker_connections 1024; //單個業務進程可接受連接數 } http{include mime.types; // 引入http mime類型&#xff08;在外部已經定義好&#xff0c…

Java數組——冒泡排序

冒泡排序是最出名的排序算法之一&#xff0c;總共有八大排序。 冒泡排序代碼并不復雜&#xff0c;共兩層循環&#xff0c;外層冒泡輪數&#xff0c;里層依次比較。 算法步驟&#xff1a; 1. 比較數組中兩個相鄰元素&#xff0c;如果第一個元素比第二個元素大&#xff0c;交換…

如何在huggingface上申請下載使用llama2/3模型

1. 在對應模型的huggingface頁面上提交申請 搜索對應的模型型號 登錄huggingface&#xff0c;在模型詳情頁面上&#xff0c;找到這個表單&#xff0c;填寫內容&#xff0c;提交申請。需要使用梯子&#xff0c;country填寫梯子的位置吧(比如美國&#xff09; 等待一小時左右…

SEMI啟動SiC專有技術項目

公司鄭重聲明&#xff0c;其正致力于篩選那些能夠穩定輸出、且可重復使用的關鍵參數性能。SEMI&#xff0c;這家SiC領域的佼佼者&#xff0c;已經啟動了一項獨具匠心的專有技術&#xff08;KGD&#xff09;篩選程序。該程序旨在為客戶提供高品質的、經過嚴格電氣分類與光學檢驗…

基于python的旅游爬蟲可視化與實現

摘要 本項目為基于python的旅游爬蟲可視化的設計與實現&#xff0c;項目以Web系統形式展示&#xff0c;利用Xpath爬蟲爬取去哪兒網針對旅游業的需求&#xff0c;對國內熱門旅游景點數據可視化系統&#xff0c;將爬取好的數據保存為CSV文件&#xff0c;再通過ORM框架導入MySQL數…

Python圖形界面(GUI)Tkinter筆記(五):控件的定位(3)

Tkinter(GUI)設計圖形界面時有三種控件的包裝方法去定位各控件在窗口(父容器、根窗口)上的位置。 【1】pack()方法:用方位來定位位置,類似于Word文檔中的文字對齊方式。 【2】grid()方法:用二維表格式的坐標值定位,類似于EXCEL單元格坐標。 【3】place()方法:用窗口…

VUE基礎之,ref屬性,props配置項,mixin(混入)

ref屬性 被用來給元素或子組件注冊引用信息&#xff08;id的替代者&#xff09; 應用在html標簽上獲取的是真實DOM元素&#xff0c;應用在組件標簽上是組件實例對象&#xff08;vc&#xff09; 使用方式&#xff1a; 打標識&#xff1a;<h1 ref"xxx">.....&l…

【python量化交易】qteasy使用教程07——創建更加復雜的自定義交易策略

創建更加復雜的自定義交易策略 使用交易策略類&#xff0c;創建更復雜的自定義策略開始前的準備工作本節的目標繼承Strategy類&#xff0c;創建一個復雜的多因子選股策略策略和回測參數配置&#xff0c;并開始回測 本節回顧 使用交易策略類&#xff0c;創建更復雜的自定義策略 …

Mysql 多表查詢,內外連接

內連接&#xff1a; 隱式內連接 使用sql語句直接進行多表查詢 select 字段列表 from 表1 , 表2 where 條件 … ; 顯式內連接 將‘&#xff0c;’改為 inner join 連接兩個表的 on select 字段列表 from 表1 [ inner ] join 表2 on 連接條件 … ; select emp.id, emp.name, …

應急響應篇——加固

Linux 安全配置 1.下載安裝安全軟件 2.取消Telnet登錄采用SSH方式并更改ssh服務端遠程登錄的配置 1)Telnet登錄協議是明文不加密不安全,所以采用更安全的SSH協議。 2)更改ssh服務端遠程登錄相關配置。 3.用戶管理相關 1)刪除不必要的用戶和用戶組。 2)用戶密碼管理…

Selenium 自動化 —— 一篇文章徹底搞懂XPath

更多關于Selenium的知識請訪問“蘭亭序咖啡”的專欄&#xff1a;專欄《Selenium 從入門到精通》 文章目錄 前言 一、什么是xpath&#xff1f; 二、XPath 節點 三. 節點的關系 1. 父&#xff08;Parent&#xff09; 2. 子&#xff08;Children&#xff09; 3. 同胞&#xff08;S…

力扣:48. 旋轉圖像(Java)

目錄 題目描述&#xff1a;輸入&#xff1a;輸出&#xff1a;代碼實現&#xff1a; 題目描述&#xff1a; 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要 使…

LangChain:模型 I/O 封裝使用解析和感觸

目錄 模型 API&#xff1a;LLM vs. ChatModel OpenAI 模型封裝 多輪對話 Session 封裝 換個國產模型 模型的輸入與輸出 Prompt 模板封裝 PromptTemplate ChatPromptTemplate MessagesPlaceholder 從文件加載 Prompt 模板 TXT模板 Yaml模板 Json模板 輸出封裝 Out…

mediasoup源碼(一)編譯及部署

基本介紹 mediasoup是一個sfu架構的流媒體服務器&#xff0c;讀者可以根據需要選擇不同的編譯方式。如果只需要學習c流媒體傳輸部分&#xff0c;則選擇mediasoup&#xff0c;如果需要學習mediasoup整個demo&#xff0c;并做演示&#xff0c;則可以選擇mediasoup-demo&#xff…

is和==的關系

Python中is和的關系 is判斷兩個變量是不是指的是同一個內存地址&#xff0c;也就是通過id()函數判斷 判斷兩個變量的值是不是相同 a [1, 2, 3, 4] b [1, 2, 3, 4] print(id(a)) # 2298268712768 print(id(b)) # 2298269716992 print(a is b) # False print(a b) # Tr…

目標檢測標注工具Labelimg安裝與使用

目錄 一、安裝Labelimg與打開 二、使用 1、基本功能介紹 2、快捷鍵 3、狀態欄的工具 三、附錄 1、YOLO模式創建標簽的樣式 2、create ML模式創建標簽的樣式 3、PascalVOC模式創建標簽的樣式 一、安裝Labelimg與打開 labelimg是一款開源的數據標注工具&#xff0c;可以…