基于 Redis 實現共享 Session 登錄的多種方法與實踐

全文目錄:

    • 開篇語
    • **前言**
    • **1. 什么是共享 Session 登錄?**
    • **2. 基于 Redis 實現共享 Session 的基本方法**
      • **2.1 通過 Redis 存儲 Session 數據**
        • **2.1.1 基本流程**
        • **2.1.2 示例代碼(Java + Spring Boot + Redis)**
    • **3. 使用 Redis 的過期時間**
      • **3.1 設置 Session 過期時間**
    • **4. 使用 Token 進行會話共享**
      • **4.1 使用 JWT(JSON Web Token)**
        • **4.1.1 示例:生成和驗證 JWT**
        • **4.1.2 登錄并返回 JWT**
    • **5. 總結**
    • 文末

開篇語

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云/阿里云/華為云/51CTO;歡迎大家常來逛逛

??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。

??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。

小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!

前言

在現代 Web 開發中,尤其是在分布式系統和微服務架構中,如何保證用戶的會話信息在多個服務之間共享是一個非常重要的問題。Redis 作為一種高性能的內存數據庫,廣泛應用于 session 管理和緩存,能夠幫助我們高效地實現共享會話。

本文將介紹基于 Redis 實現共享 Session 登錄的多種方法與實踐,重點討論如何使用 Redis 存儲和共享用戶的登錄信息。

1. 什么是共享 Session 登錄?

共享 Session 登錄是指,在一個系統中,用戶登錄后,能夠在多個服務或多個應用實例之間共享其登錄狀態。這樣,用戶可以在一個服務中登錄后,無需再次在其他服務中登錄,從而提高用戶體驗和系統的可擴展性。

常見的實現方式包括:

  • 將用戶的登錄信息存儲在一個共享的存儲(如 Redis)中,其他服務可以通過 Redis 獲取和驗證用戶的登錄狀態。
  • 通過統一的認證服務管理用戶登錄信息,使用 Redis 作為跨服務存儲會話數據的中心。

2. 基于 Redis 實現共享 Session 的基本方法

2.1 通過 Redis 存儲 Session 數據

最常見的共享 Session 登錄實現方式是使用 Redis 存儲 Session 數據。每次用戶登錄時,系統會將用戶的會話信息(如用戶 ID、登錄時間、權限信息等)存儲到 Redis 中,并將 Session ID(通常是一個唯一的字符串)作為 Redis 鍵。其他服務可以通過 Session ID 從 Redis 獲取會話信息,從而共享用戶的登錄狀態。

2.1.1 基本流程
  1. 用戶登錄時,系統生成一個 Session ID(例如,可以使用 UUID 或隨機字符串)并將其存儲在 Redis 中,存儲的值是包含用戶信息的 JSON 字符串或對象。
  2. 用戶的瀏覽器通過 Cookie 或 HTTP 頭部將 Session ID 發送到后端,后端通過 Redis 查詢對應的會話數據,驗證用戶的身份信息。
  3. 如果 Redis 中找到了對應的 Session 數據,則表示用戶已經登錄,后端可以根據會話信息判斷用戶的權限等。
2.1.2 示例代碼(Java + Spring Boot + Redis)

假設我們使用 Spring Boot 和 Spring Data Redis 來實現共享 Session 登錄。

1. 引入 Redis 相關依賴

pom.xml 中添加 Redis 相關依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>

2. Redis 配置類

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new StringRedisSerializer());return template;}
}

3. 登錄時存儲 Session 數據

當用戶登錄時,生成 Session ID,并將用戶信息存儲到 Redis。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;@Service
public class SessionService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;private static final String SESSION_PREFIX = "session:";// 用戶登錄時,生成 Session ID,并將會話信息存儲到 Redispublic void createSession(String sessionId, User user) {String sessionKey = SESSION_PREFIX + sessionId;redisTemplate.opsForValue().set(sessionKey, user, 30, TimeUnit.MINUTES);  // 設置過期時間為30分鐘}// 獲取 Session 信息public User getSession(String sessionId) {String sessionKey = SESSION_PREFIX + sessionId;return (User) redisTemplate.opsForValue().get(sessionKey);}
}

4. 用戶登錄控制器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/auth")
public class AuthController {@Autowiredprivate SessionService sessionService;@PostMapping("/login")public String login(@RequestParam String username, @RequestParam String password) {// 假設用戶驗證通過String sessionId = generateSessionId();  // 生成唯一的 Session IDUser user = new User(username);  // 創建用戶對象(這里只存用戶名作為例子)// 將 Session 數據存儲到 RedissessionService.createSession(sessionId, user);return "Login successful, Session ID: " + sessionId;}@GetMapping("/profile")public String profile(@RequestParam String sessionId) {// 從 Redis 獲取用戶會話數據User user = sessionService.getSession(sessionId);if (user == null) {return "Session expired or invalid";}return "User profile: " + user.getUsername();}private String generateSessionId() {return "SESSION_" + System.currentTimeMillis();}
}

在這個示例中,當用戶登錄時,系統會生成一個 Session ID,并將用戶信息存儲到 Redis 中。后續的請求可以通過 Session ID 來獲取用戶信息,從而實現共享登錄。

3. 使用 Redis 的過期時間

為了確保 Session 不會長時間占用 Redis 內存,通常會為 Session 設置過期時間。上面的例子中,我們將 Session 設置為 30 分鐘過期。

3.1 設置 Session 過期時間

通過 Redis 的 expiresetex 命令,我們可以設置緩存的過期時間,避免過期的 Session 數據一直占用內存。

// 設置 Session 數據并設置過期時間為30分鐘
redisTemplate.opsForValue().set(sessionKey, user, 30, TimeUnit.MINUTES);

如果 Session 數據在規定的時間內沒有被訪問,它會自動從 Redis 中刪除。

4. 使用 Token 進行會話共享

在分布式架構中,使用 Token(如 JWT)作為用戶會話的標識是一種常見的做法。每次用戶請求時,客戶端會發送包含用戶信息的 Token,后端從 Redis 獲取 Token 對應的用戶信息。

4.1 使用 JWT(JSON Web Token)

JWT 是一種自包含的方式,可以將用戶信息直接嵌入到 Token 中,而不需要將會話信息存儲在 Redis 中。JWT 本身具有過期時間和有效性驗證,可以減少 Redis 的存儲壓力。

4.1.1 示例:生成和驗證 JWT
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;public class JwtUtil {private static final String SECRET_KEY = "secretkey";public static String createToken(String username) {return Jwts.builder().setSubject(username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小時有效期.signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}public static String getUsernameFromToken(String token) {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();}
}
4.1.2 登錄并返回 JWT
@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public String login(@RequestParam String username, @RequestParam String password) {// 用戶驗證邏輯String token = JwtUtil.createToken(username);return "Login successful, Token: " + token;}@GetMapping("/profile")public String profile(@RequestHeader String token) {String username = JwtUtil.getUsernameFromToken(token);if (username == null) {return "Invalid or expired token";}return "User profile: " + username;}
}

通過這種方式,使用 Redis 和 JWT 可以有效實現共享登錄,而不需要存儲過多的會話信息。

5. 總結

基于 Redis 實現共享 Session 登錄是提升 Web 系統性能和用戶體驗的有效方法。以下是常見的實現方案:

  • 使用 Redis 存儲會話數據:將用戶的會話信息存儲在 Redis 中,并通過 Session ID 進行共享。
  • 使用 Token(如 JWT):通過 JWT 進行會話驗證,減少 Redis 存儲壓力,同時也適用于分布式環境。
  • 設置合理的過期時間:確保會話信息不會無限期占用內存,避免資源浪費。

結合 Redis 和 Token,我們可以輕松實現跨服務、跨應用的共享會話登錄,并有效管理用戶的會話信息。

… …

文末

好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。

… …

學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!

wished for you successed !!!


??若喜歡我,就請關注我叭。

??若對您有用,就請點贊叭。
??若有疑問,就請評論留言告訴我叭。


版權聲明:本文由作者原創,轉載請注明出處,謝謝支持!

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

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

相關文章

spring cloud + easyRules 零基礎搭建智能規則引擎

你是否曾想過在項目中嵌入一套輕量級且高度可擴展的規則引擎&#xff0c;輕松實現動態化的業務決策&#xff1f;在金融、電商、政務等領域&#xff0c;風險控制是業務安全的核心。傳統硬編碼方式很難應對復雜多變的風控需求&#xff0c;而規則引擎允許我們將這些規則獨立出來&a…

AI應用:電路板設計

Diode Computers 公司 Diode Computers是一家專注于利用AI技術進行定制電路板設計和制造的公司&#xff0c;提供從概念到量產的全流程服務。其核心優勢在于將電路板設計轉化為AI可理解的代碼形式&#xff0c;大幅提升設計效率并降低傳統EDA工具的使用門檻 0。 核心服務 設計與制…

RocketMQ學習系列之——客戶端消息確認機制

一、客戶端使用MQ基本代碼示例1、添加maven依賴<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version> </dependency>2、生產者代碼示例public class Produc…

[leetcode] 組合總和

39. 組合總和 - 力扣&#xff08;LeetCode&#xff09; i class Solution {int aim;vector<vector<int>> ret;vector<int> path; public:vector<vector<int>> combinationSum(vector<int>& nums, int target) {aim target;dfs(nums…

新能源行業B端極簡設計:碳中和目標下的交互輕量化實踐

新能源行業B端極簡設計&#xff1a;碳中和目標下的交互輕量化實踐內容摘要在新能源行業&#xff0c;碳中和目標正推動著企業追求更高的運營效率和更低的資源消耗。然而&#xff0c;傳統的B端交互設計往往復雜繁瑣&#xff0c;不僅增加了用戶的操作成本&#xff0c;還可能導致資…

減速機:自動化生產線的“精密傳動心臟”

減速機作為自動化生產線的核心傳動部件&#xff0c;通過調節轉速與扭矩實現設備精準控制&#xff0c;其在自動化生產線中發揮著關鍵作用。以下是其具體應用方式&#xff1a;輸送線驅動在自動化生產線中&#xff0c;輸送線用于運輸物料、半成品或成品&#xff0c;通過減速機可以…

從0到1學PHP(五):PHP 數組:高效存儲與處理數據

目錄一、數組的定義與分類1.1 索引數組1.2 關聯數組1.3 多維數組二、數組的基本操作2.1 數組元素的添加、刪除、修改和訪問2.2 數組指針的操作三、數組處理函數3.1 數組排序函數3.2 數組統計函數3.3 數組過濾與轉換函數一、數組的定義與分類 在 PHP 中&#xff0c;數組是一種非…

vscode 字體的跟換

打開vscode 左下角輸入電腦中已經有的字體&#xff1a;有想要用的可以自己進行安裝刷新這樣就可改變了

墨者:SQL過濾字符后手工注入漏洞測試(第3題)

1. 墨者學院&#xff1a;SQL過濾字符后手工注入漏洞測試(第3題)&#x1f680; 因為練習過太多的sql注入&#xff0c;廢話不多介紹&#xff0c;我會通過圍繞手動注入和工具爆破的方式達到靶場目標&#xff0c;開練&#xff01;&#xff01;&#xff01; 2. 手工注入方式&#x1…

【Spring AI實戰】實現仿DeepSeek頁面對話機器人(支持多模態上傳)

一、前言 二、實現效果 三、代碼實現 3.1 后端代碼 3.2 前端代碼 一、前言 Spring AI詳解&#xff1a;【Spring AI詳解】開啟Java生態的智能應用開發新時代(附不同功能的Spring AI實戰項目)-CSDN博客 二、實現效果 可上傳圖片或音頻數據給大模型分析 三、代碼實現 3.1 后…

Vue 正在熱映模塊

Vue 漸進式JavaScript 框架 基于Vue2的移動端項目&#xff1a;正在熱映模塊 目錄 正在熱映 數據修改 導入axios 配置反向代理 正在熱映渲染 賦值數據 渲染列表 顯示圖片 優化列表 設置列表樣式 主演 定義過濾器 使用過濾器 主演過長處理 無主演情況處理 觀眾評…

阿里云上進行k8s集群的配置

在阿里云容器服務Kubernetes&#xff08;ACK&#xff09;中配置集群的核心步驟可分為以下六大關鍵環節&#xff0c;涵蓋架構設計到運維管理&#xff1a;1. 集群規劃與基礎配置 集群類型選擇 托管版&#xff1a;Master節點由阿里云托管&#xff08;推薦生產環境&#xff09;專有…

頁面性能優化

優化點解決方案效果雙向綁定數量過多競對設置單元格內部涉及雙向綁定的輸入組件過多&#xff0c;線上頁面最多有88個該和抽屜中的編輯表格一樣的組件&#xff0c;共計930個&#xff08;按每行最少6個來計算的&#xff09;雙向綁定的組件&#xff0c;嚴重拖累頁面性能。數據計算…

詳細說明零拷貝

詳細說明零拷貝【一】零拷貝介紹【1】說明【2】為什么需要零拷貝&#xff1f;—— 傳統數據傳輸的問題【3】零拷貝的核心優化【4】零拷貝的實現方式&#xff08;1&#xff09;mmap&#xff08;內存映射&#xff09;&#xff08;2&#xff09;sendfile&#xff08;Linux 系統調用…

docker部署自己寫的c++http服務器教程

我用的是ubuntu 22.04環境下 qt c 寫的應用程序&#xff0c;是終端程序&#xff0c;不是界面&#xff0c;然后用linuxdeployqt工具將其打包成了AppImage可執行文件&#xff0c;以上是部署前的準備工作&#xff0c;需要確保AppImage可執行文件在自己的ubuntu上可以運行才能執行以…

Caffeine 緩存庫的常用功能使用介紹

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)

目錄 列表&#xff08;List&#xff09;特點 創建列表 RemoveAll 刪除與之條件相匹配的數據 會返回刪除的個數 Capacity 獲取或設置列表的容量 更多方法可參照上篇文章&#xff1a;C#_ArrayList動態數組 字典&#xff08;Dictionary&#xff09;特點 定義一個字典 向字…

【實時Linux實戰系列】實時網絡控制與調度

在實時控制系統中&#xff0c;網絡調度是確保實時數據流傳輸和處理不受延遲影響的關鍵。實時網絡控制與調度技術對于工業自動化、金融交易、多媒體流等領域至關重要。通過合理設計網絡調度策略&#xff0c;可以顯著提高系統的實時性和可靠性。本文將介紹如何在實時控制系統中實…

Qwen3-Coder:介紹及使用 -- 超強AI編程助手

更多內容&#xff1a;XiaoJ的知識星球 目錄一、Qwen3-Coder模型介紹1.預訓練階段&#xff08;Pre-Training&#xff09;2.后訓練階段&#xff08;Post-Training&#xff09;1&#xff09;Scaling Code RL: Hard to Solve, Easy to Verify2&#xff09;Scaling Long-Horizon RL二…

uniapp 如果進入頁面輸入框自動聚焦,此時快速返回頁面或者跳轉到下一個頁面,輸入法頂上來的頁面出現半屏的黑屏問題。

如果進入頁面輸入框自動聚焦&#xff0c;此時快速返回頁面或者跳轉到下一個頁面&#xff0c;輸入法頂上來的頁面出現半屏的黑屏問題。輸入法出來后&#xff0c;設置了自動將頁面頂上來的配置&#xff1a;pages.json"softinputMode": "adjustResize""g…