当前位置:

首页 > 编程开发 > SpringBoot怎么整合Spring Session实现分布式会话

SpringBoot怎么整合Spring Session实现分布式会话

Spring提供了处理分布式会话的解决方案:Spring-Session。Spring-Session提供了对Redis、MongoDB、MySQL等常用存储的支持,Spring-Session提供与HttpSession的透明整合,这意味着开发人员可以使用Spring-Session支持的实现方式,切换HttpSession至Spring-Session。一、配置及开发Step1、添加依赖在项目的pom.xml文件中添加Redis和Spring-Session的依赖包。org.springframewo

本文目录

    Spring 提供了处理分布式会话的解决方案:Spring-Session。Spring-Session 提供了对Redis、MongoDB、MySQL 等常用存储的支持,Spring-Session 提供与 HttpSession 的透明整合,这意味着开发人员可以使用 Spring-Session 支持的实现方式,切换 HttpSession 至 Spring-Session。

    一、配置及开发

    Step 1、添加依赖

    在项目的 pom.xml 文件中添加 Redis 和 Spring-Session 的依赖包。

            
                    org.springframework.boot
                    spring-boot-starter-data-redis
            
            
                org.springframework.session
                spring-session-data-redis
            

    Step 2、配置 Redis 和 Spring-Session 持久化方式

    笔者习惯使用 application.properties 作为 SpringBoot 的配置文件,也可以使用 application.yml 来配置。在 application.properties 配置文件中添加如下配置。

    # 配置 Redis 服务器地址(此处是一个虚假地址)
    spring.redis.host=10.211.12.6
    # 配置 Redis 端口
    spring.redis.port=6379
    # 配置 Redis 密码
    spring.redis.password=123456
    # 其他 Redis 的配置还有很多,例如 Redis 连接池的配置,此处暂时只配置上述几项关键点
    # spring session 配置
    spring.session.store-type=redis

    Step 3、使用 JSON 序列化机制

    Spring-Session 默认使用 JDK 序列化机制,要求类实现 Serializable 接口,序列化后是二进制字节数组,不易看懂。使用 JSON 序列化机制,序列化后的字符串容易看懂。

    package com.test.conf;
    
    import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.serializer.RedisSerializer;
    
    // spring session 使用 json 序列化机制
    @Configuration
    public class SessionConfig {
        @Bean
        public RedisSerializer springSessionDefaultRedisSerializer() {
            return new GenericFastJsonRedisSerializer();
        }
    }

    Step 4、在 SpringBoot 启动类中添加 @EnableRedisHttpSession 注解,开启 Spring-Session

    package com.test;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
    
    @SpringBootApplication
    // 开启 Spring-Session
    @EnableRedisHttpSession
    // @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800, redisNamespace = "test:session")
    public class TestSessionAppApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(TestSessionAppApplication.class, args);
        }
    }

     打上 @EnableRedisHttpSession 注解即可开启 Spring-Session。注解有几个参数可以单独设置,其中 maxInactiveIntervalInSeconds 表示 Session 过期时间,默认值是 30 分钟;redisNamespace 表示 Session 在 Redis 中存储时的命名空间,即 Session 在 Redis 中存储的键名前缀,默认值是 “spring:session”,在实际项目中,可能不同的系统为了节约资源,会使用同一个 Redis,为了区分不同系统的 Session,可以为每个系统设置单独的命名空间。

    二、测试

    2.1 controller 层编写测试 demo

        @RequestMapping(value = "testSession")
        public String testSession(HttpServletRequest request) {
            HttpSession session = request.getSession();
            log.info("sessionId:[{}]", session.getId());
            session.setAttribute("name", "Lucy");
            session.setAttribute("age", "20");
            return session.getAttribute("name").toString();
        }

    2.2 测试过程

    同时以不同的端口 9001/9002 启动 SpringBoot 项目,在本机电脑上模拟分布式集群中的不同节点。用谷歌浏览器打开链接 http://localhost:9001/testSession,服务端打印日志如下所示。

    sessionId:[5c417104-4f6d-430d-b569-cbc1e19cdf02]

    客户端登录 Redis 服务器,查看 Redis 中的 Session 内容。

    [testuser@vm ~]$ redis-cli -h 10.211.12.6 -p 6379
    10.211.12.6:6379> auth 123456
    OK
    10.211.12.6:6379> keys *
    1) "spring:session:expirations:1658127780000"
    2) "spring:session:sessions:5c417104-4f6d-430d-b569-cbc1e19cdf02"
    3) "spring:session:sessions:expires:5c417104-4f6d-430d-b569-cbc1e19cdf02"

    Redis 会为每个 RedisSession 存储三个键值对(以下简称 key-value):

    • 第一个 key-value 存储这个 Session 的 Id,是一个 Set 类型的 Redis 数据结构。这个 key 中的最后的 1658127780000 值是一个时间戳,根据这个 Session 过期时刻滚动至下一分钟而计算得出。

    • 第二个 key-value 用来存储 Session 的详细信息,是一个 Hash 类型的 Redis 数据结构,包括 Session 的最近访问时间(lastAccessedTime)、过期时间间隔(maxInactiveInterval,默认是 30 分钟,这里保存的秒值)、创建时间(creationTime)、sessionAttr 等等。

    • 第三个 key-value 用来表示 Session 在 Redis 中的过期时间,是一个 String 类型的 Redis 数据结构。这个 key-value 不存储任何有用数据,只是为表示 Session 过期而设置。这个 key 在 Redis 中的过期时间即为 Session 的过期时间间隔,可以用 ttl 命令查看该 key 的过期时间,即为 Session 的过期时间。

    本次测试时,Redis 中的数据详情如下所示。

    10.211.12.6:6379> type spring:session:expirations:1658127780000
    set
    10.211.12.6:6379> smembers spring:session:expirations:1658127780000
    1) "\"expires:5c417104-4f6d-430d-b569-cbc1e19cdf02\""
    10.211.12.6:6379>
    10.211.12.6:6379> type spring:session:sessions:5c417104-4f6d-430d-b569-cbc1e19cdf02
    hash
    10.211.12.6:6379> hgetall spring:session:sessions:5c417104-4f6d-430d-b569-cbc1e19cdf02
     1) "lastAccessedTime"
     2) "1658125969794"
     3) "maxInactiveInterval"
     4) "1800"
     5) "creationTime"
     6) "1658125925139"
     7) "sessionAttr:age"
     8) "\"20\""
     9) "sessionAttr:name"
    10) "\"Lucy\""
    10.211.12.6:6379>
    10.211.12.6:6379> type spring:session:sessions:expires:5c417104-4f6d-430d-b569-cbc1e19cdf02
    string
    10.211.12.6:6379> get spring:session:sessions:expires:5c417104-4f6d-430d-b569-cbc1e19cdf02
    ""
    10.201.42.26:6379>

    查看浏览器 Cookie,此时浏览器已经有了一个正在使用的 Cookie,见下图。

    SpringBoot怎么整合Spring Session实现分布式会话

    刷新浏览器,后端打印的 SessionId 不变,Redis 中的 Session 内容未新增,浏览器正常返回内容。说明本节点操作 Session 正常。

    同一浏览器,打开另外一个测试端口链接 http://localhost:9002/testSession,浏览器自动携带 Cookie,后端打印内容相同,Redis 内容相同(过期时间已更新),说明集群节点之间共享了 Session。

    三、Spring-Session 的缺点

    虽然 Spring-Session 提供了一种简单易用,近乎透明的集成方式,使得支持集群会话变得微不足道,但是实际上 Spring-Session 是有些缺陷的。

    • 无法做到 Session 的过期以及销毁事件的实时发布;

    • 序列化方式可能对一些特定类型的会话,支持的不是很好;

    • Redis 存储一个会话需要 3 个 键值,占用空间稍微大些;

    • 在高并发场景下,Session 因为不是 CAS(Compare And Set) 操作,所以可能存在一些并发问题(小问题)。

    虽然 Spring-Session 存在一些缺点,但整体来说还是可用性很高的。此外自己可以写一套过滤器,优化 Spring-Session 的缺点,实现分布式会话。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    解析SpringBoot和SpringMVC之间的异同
    解析SpringBoot和SpringMVC之间的异同

    解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

    探索SpringCloud和SpringBoot在微服务领域的不同应用方式
    探索SpringCloud和SpringBoot在微服务领域的不同应用方式

    近年来,随着云计算和分布式架构的兴起,微服务架构的应用越来越广泛。而SpringCloud和SpringBoot作为Java开发中的两个重要框架,对于微服务的实现起到了重要的作用。然而,很多人对于它们在微服务领域的不同应用方式还存在一定的疑惑。本文将从不同的角度探索SpringCloud和SpringBoot在微服务中的应用方式。首先,我们来了解一下Spri

    SpringBoot和SpringMVC有何区别?
    SpringBoot和SpringMVC有何区别?

    SpringBoot与SpringMVC的不同之处在哪里?SpringBoot和SpringMVC是两个非常流行的Java开发框架,用于构建Web应用程序。尽管它们经常分别被使用,但它们之间的不同之处也是很明显的。首先,SpringBoot可以被看作是一个Spring框架的扩展或者增强版。它旨在简化Spring应用程序的初始化和配置过程,以帮助开发人

    比较SpringBoot和SpringMVC的异同
    比较SpringBoot和SpringMVC的异同

    SpringBoot和SpringMVC都是Java开发中常用的框架,但它们之间有一些明显的差异。本文将探究这两个框架的特点和用途,并对它们的差异进行比较。首先,我们来了解一下SpringBoot。SpringBoot是由Pivotal团队开发的,它旨在简化基于Spring框架的应用程序的创建和部署。它提供了一种快速、轻量级的方式来构建独立的、可执行

    SpringBoot与SpringMVC的不同点是什么?
    SpringBoot与SpringMVC的不同点是什么?

    SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。一、SpringBoot的特点:简化配置:SpringBoot通过约定优于配置的原则,大大简化了项目的配置过程。它可以自动配置项目所需要的参数,开发人

    比较和选择指南:SpringCloud与SpringBoot的功能比较
    比较和选择指南:SpringCloud与SpringBoot的功能比较

    SpringCloud和SpringBoot是目前Java领域中最热门的开源框架,它们分别提供了一套完善的微服务架构和快速构建应用程序的解决方案。本文将对它们的功能进行比较,并给出选择指南,以帮助读者了解它们的优势和适用场景。SpringBoot是一个用于开发Java应用程序的框架,它提供了一个简化的开发流程,集成了大量常用的功能和组件,减少了开发者的工作量

    SpringCloud与SpringBoot:分析它们之间的相似与不同
    SpringCloud与SpringBoot:分析它们之间的相似与不同

    深入剖析SpringCloud和SpringBoot的异同引言:在构建企业级应用程序时,Spring框架已经成为开发者们的首选。它提供了一种简单而强大的方式来构建独立于平台的应用程序。Spring框架由两个核心模块组成:SpringBoot和SpringCloud。虽然它们都可以帮助开发者快速搭建应用程序,但它们的目标和用途存在一些差异。本文将深入剖析Spr

    从架构角度看SpringCloud与SpringBoot的差异
    从架构角度看SpringCloud与SpringBoot的差异

    从架构角度看SpringCloud与SpringBoot的差异引言:在当今的互联网时代,构建分布式系统已经成为了一种必要的需求。而SpringBoot和SpringCloud正是为了满足这个需求而诞生的。尽管它们都是由Spring框架所提供的解决方案,但从架构角度来看,它们存在着一些重要的差异。本文将从架构的角度出发,对SpringBoot和SpringCl

    Java API 开发中使用 SpringBoot 的利弊分析
    Java API 开发中使用 SpringBoot 的利弊分析

    JavaAPI开发中使用SpringBoot的利弊分析随着互联网的快速发展和技术的不断更新迭代,Java技术在开发中的广泛应用引起了人们的重视。而SpringBoot作为一种微服务架构的解决方案,已经逐渐成为Java开发中的热门选择。那么,在JavaAPI开发中使用SpringBoot,到底有哪些利弊呢?下面来分析一下。利:简化开发

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    为什么要购买正版软件?
    01 官方授权

    授权来源透明,订单与许可信息可随时查询。

    02 即时交付

    付款成功后自动发放激活信息,支持订单追踪。

    03 中文协助

    安装、激活、迁移与续费问题都有专人响应。

    04 长期可用

    提供升级提醒与授权管理,换机时也能轻松迁移。

    网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

    Copyright ©2018-2026