Spring Session与分布式会话管理详解
随着微服务架构的普及,分布式系统中的会话管理变得尤为重要。传统的单点会话管理已经不能满足现代应用的需求。本文将深入探讨Spring Session及其在分布式会话管理中的应用。
什么是Spring Session?
Spring Session是一个用于管理HttpSession的Spring框架模块。它能够将HttpSession存储在各种后端数据存储中,如Redis、JDBC、Hazelcast等,从而实现会话共享,为分布式系统中的会话管理提供了便捷的解决方案。
为什么需要分布式会话管理?
在分布式系统中,用户的请求可能会被路由到不同的服务实例。如果会话数据仅存储在单个实例中,会导致无法跨实例访问会话数据。因此,我们需要一种机制来共享会话数据,使得任何实例都可以访问相同的会话信息。
Spring Session的主要特性
- HttpSession的集成:Spring Session提供了一个新的
HttpSession实现,使得会话可以存储在各种后端。 - 并发访问:支持并发会话的访问和修改。
- 透明性:几乎不需要修改代码即可实现分布式会话管理。
- 多种存储支持:支持Redis、JDBC、Hazelcast等多种存储机制。
使用Spring Session实现分布式会话管理
下面我们将以Redis为例,详细介绍如何使用Spring Session实现分布式会话管理。
环境准备
- JDK 1.8+
- Spring Boot 2.x
- Redis服务器
创建Spring Boot项目
你可以使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:
<dependencies><!-- Spring Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Session Data Redis --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><!-- Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Spring Boot Starter Security (Optional) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
</dependencies>
配置Redis
在application.properties中配置Redis连接信息:
spring.redis.host=localhost
spring.redis.port=6379
配置Spring Session
创建一个配置类,启用Spring Session并配置Redis:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.data.redis.config.ConfigureRedisAction;
import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;@Configuration
@EnableRedisHttpSession
public class SessionConfig {@Beanpublic ConfigureRedisAction configureRedisAction() {return ConfigureRedisAction.NO_OP;}
}
创建一个简单的Controller
我们创建一个简单的Controller,用于测试会话的共享:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@RestController
@RequestMapping("/session")
public class SessionController {@GetMapping("/set")public String setAttribute(@RequestParam("name") String name, HttpSession session) {session.setAttribute("name", name);return "Attribute set in session";}@GetMapping("/get")public String getAttribute(HttpSession session) {String name = (String) session.getAttribute("name");return "Attribute in session: " + name;}
}
运行与测试
启动Spring Boot应用,使用Postman或Curl进行测试:
-
设置会话属性:
GET http://localhost:8080/session/set?name=John -
获取会话属性:
GET http://localhost:8080/session/get
如果你在不同的服务实例中运行应用,并使用相同的Redis配置,你将会发现会话数据可以在不同实例间共享。
扩展:使用Spring Security与Spring Session整合
如果你的应用使用了Spring Security,可以通过以下方式与Spring Session整合:
-
添加Spring Security依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> -
配置Spring Security:
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();} } -
在Controller中添加一个受保护的端点:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/secure") public class SecureController {@GetMappingpublic String secureEndpoint() {return "This is a secure endpoint";} }
测试安全的会话管理
通过浏览器或Postman访问受保护的端点:
GET http://localhost:8080/secure
你将会被重定向到登录页面。登录后,会话将被存储在Redis中,实现分布式会话管理。
总结
通过Spring Session与Redis的结合,我们可以轻松实现分布式会话管理,为分布式系统中的会话共享提供了强有力的支持。无论是简单的HttpSession管理,还是与Spring Security的整合,Spring Session都能提供灵活而强大的解决方案。
希望本文能够帮助你理解并掌握Spring Session的使用,为你的分布式系统开发提供参考。如果你有任何问题或建议,欢迎在评论区留言讨论。
相关文章:
Spring Session与分布式会话管理详解
随着微服务架构的普及,分布式系统中的会话管理变得尤为重要。传统的单点会话管理已经不能满足现代应用的需求。本文将深入探讨Spring Session及其在分布式会话管理中的应用。 什么是Spring Session? Spring Session是一个用于管理HttpSession的Spring框…...
从0开始学习pyspark--Spark DataFrame数据的选取与访问[第5节]
在PySpark中,选择和访问数据是处理Spark DataFrame的基本操作。以下是一些常用的方法来选择和访问DataFrame中的数据。 选择列(Selecting Columns): select: 用于选择DataFrame中的特定列。selectExpr: 用于通过SQL表达式选择列。 df.select…...
Fastjson首字母大小写问题
1、问题 使用Fastjson转json之后发现首字母小写。实体类如下: Data public class DataIdentity {private String BYDBSM;private String SNWRSSJSJ;private Integer CJFS 20; } 测试代码如下: public static void main(String[] args) {DataIdentit…...
GuLi商城-商品服务-API-品牌管理-效果优化与快速显示开关
<template><div class"mod-config"><el-form :inline"true" :model"dataForm" keyup.enter.native"getDataList()"><el-form-item><el-input v-model"dataForm.key" placeholder"参数名&qu…...
如何成为C#编程高手?
成为C#编程高手需要时间、实践和持续的学习。以下是一些建议,可以帮助你提升C#编程技能: 深入理解基础知识: 确保你对C#的基本语法、数据类型、控制结构、面向对象编程(OOP)原则有深刻的理解。学习如何使用Visual Stud…...
SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]
SpringBoot自定义starter SpringBoot与AOPSpringBoot集成Mybatis-整合druid在不使用启动器的情况下,手动写配置类进行整合使用启动器的情况下,进行整合 SpringBoot启动原理源码解析创建SpringApplication初始化SpringApplication总结 启动 SpringBoot自定义Starter定…...
Maven - 在没有网络的情况下强制使用本地jar包
文章目录 问题解决思路解决办法删除 _remote.repositories 文件代码手动操作步骤验证 问题 非互联网环境,无法从中央仓库or镜像里拉取jar包。 服务器上搭建了一套Nexus私服。 Nexus私服故障,无法连接。 工程里新增了一个Jar的依赖, 本地仓…...
JAVA--JSON转换工具类
JSON转换工具类 import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackso…...
每日复盘-20240705
今日关注: 20240705 六日涨幅最大: ------1--------300391--------- 长药控股 五日涨幅最大: ------1--------300391--------- 长药控股 四日涨幅最大: ------1--------300391--------- 长药控股 三日涨幅最大: ------1--------300391--------- 长药控股 二日涨幅最…...
MySQL 一些用来做比较的函数
目录 IF:根据不同条件返回不同的值 CASE:多条件判断,类似于Switch函数 IFNULL:用于检查一个值是否为NULL,如果是,则用指定值代替 NULLIF:比较两个值,如果相等则返回NULLÿ…...
一个使用率超高的大数据实验室是如何练成的?
厦门大学嘉庚学院“大数据应用实训中心”(以下简称“实训中心”)自2022年建成以来,已经成为支撑“大数据专业”复合型人才培养的重要支撑,目前实训中心在专业课程实验教学、项目实训、数据分析类双创比赛、毕业设计等方面都有深入…...
Chiasmodon:一款针对域名安全的公开资源情报OSINT工具
关于Chiasmodon Chiasmodon是一款针对域名安全的公开资源情报OSINT工具,该工具可以帮助广大研究人员从各种来源收集目标域名的相关信息,并根据域名、Google Play应用程序、电子邮件地址、IP地址、组织和URL等信息进行有针对性的数据收集。 该工具可以提…...
如何在Java中实现PDF生成
如何在Java中实现PDF生成 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在软件开发和企业应用中,生成PDF文档是一项常见的需求。Java作为一种强大…...
Redis 的缓存淘汰策略
Redis 作为一个高性能的内存数据库,提供了多种缓存淘汰策略(也称为过期策略或驱逐策略),用于管理内存使用。当 Redis 达到其内存限制时,系统会根据配置的策略删除一些数据,以释放内存空间。以下是 Redis 支…...
音乐播放器
目录 一、设计目标二、实现流程1. 数据库操作2. 后端功能实现3. 前端UI界面实现4. 程序入口 三、项目收获 一、设计目标 1. 模拟网易云音乐,实现本地音乐盒。 2. 功能分析: 登录功能窗口显示加载本地音乐建立播放列表播放音乐删除播放列表音乐 3.设计思…...
三星组件新的HBM开发团队加速HBM研发
为应对人工智能(AI)市场扩张带来的对高性能存储解决方案需求的增长,三星电子在其设备解决方案(DS)部门内部成立了全新的“HBM开发团队”,旨在提升其在高带宽存储器(HBM)领域的竞争力。根据Business Korea的最新报告,该团队将专注于推进HBM3、…...
图书馆数据仓库
目录 1.数据仓库的数据来源为业务数据库(mysql) 初始化脚本 init_book_result.sql 2.通过sqoop将mysql中的业务数据导入到大数据平台(hive) 导入mysql数据到hive中 3.通过hive进行数据计算和数据分析 形成数据报表 4.再通过sq…...
基于uniapp(vue3)H5附件上传组件,可限制文件大小
代码: <template><view class"upload-file"><text>最多上传5份附件,需小于50M</text><view class"" click"selectFile">上传</view></view><view class"list" v…...
Phoenix Omid Timestamp Oracle 组件实现原理
Omid Timestamp Oracle 组件实现原理 作用 生成全局单调递增的时间戳,支持获取操作和崩溃恢复。 功能 1.生成全局单调递增的时间戳(支持崩溃恢复)apinext返回下一个时间戳getLast返回最后一个分配的时间戳(当前时间戳)实现方式TimestampOracleImpl单调递增的时间…...
Lex Fridman Podcast with Andrej Karpathy
我不太喜欢Lex Fridman的声音,总觉得那让人昏昏欲睡, 但无奈他采访的人都太大牌了,只能去听。但是听着听着,就会觉得有深度的采访这些人,似乎也只有他这种由研究员背景的人能干, 另,他提的问题确…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
