全文目录:

    • 开篇语
    • **前言**
    • **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…