spring-boot+spring-session集成

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

在这个微服务,分布式的时代,很多传统的实现方案变的不再那么适用,比如传统的web服务将session放在内存中的情况,当web服务做水平扩展部署的时候,session共享就成了需要处理的问题。目前有很多成熟的技术可供我们选择,下面简单介绍最近用到的spring-boot+spring-session实现session共享的方案。

spring-boot集成spring-session非常简单,因为spring-boot为我们完成了非常多的工作。具体集成步骤如下:

一、工程继承spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

这样做的好处是我们接下来引入其他依赖包可以不需要考虑版本问题,推荐这样做,避免自己引入不当导致的兼容性问题。

二、引入spring-session依赖包

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
</dependency>

引入之后,我们要确定我们要将session持久化到哪种介质中了。因为分布式session可以持久化到数据库、redis、nosql等中,根据存储方式不同,需要引入不同的jar包和做不同的操作。我们以redis存储为例。

三、引入redis依赖包

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

由于我们使用了spring-boot,所以我们只需要引入spring-boot-starter-data-redis依赖即可,这样我们可以很好的利用spring-boot开箱即用以及非常方便的配置优势。

四、基础配置

由于我们引入了redis,这样我们需要在application.properties或者application.yml文件中配置redis连接,使用spring-boot我们可以很方便配置单点redis,哨兵模式,集群模式等,简单起见我们配置一个单点模式的redis连接并采用连接池

spring.redis.port=6379
spring.redis.host=127.0.0.1
spring.redis.password=******
spring.redis.pool.max-active=100
spring.redis.pool.max-idle=5
spring.redis.pool.max-wait=60000

完成以上步骤之后,我们只需要告诉spring开启redis方式的session存储即可,这里有两种方式可以实现

  • 方式1、在配置文件中添加一行配置
spring.session.store-type=redis
  • 方式2、在程序启动类上添加注解
@EnableRedisHttpSession

两种方式都可以完成开启spring-session的redis存储,是不是非常简单。因为spring-boot的特性,以前很多需要在xml中配置的都可以轻松帮我们搞定。

扩展

虽然我们实现了redis方式存储的分布式session,但是在实际场景中可能还有一些需要优化的地方。

一、修改cookies中sessionId的名字

二、修改session存放在redis中的命名空间

三、修改session超时时间

为什么要这样做呢,如果我们有两套不同系统A和B,cookies中session名称相同会导致同一个浏览器登录两个系统会造成相互的干扰,例如两个系统中我们存放在session中的用户信息的键值为user。默认情况下cookies中的session名称为JSESSIONID。当我们登录A系统后,在同一个浏览器下打开B系统,B系统B系统拿到的user实际上并非自己系统的user对象,这样会造成系统异常;而如果我们A、B系统存放用户信息的键值设置为不相同,例如userA和userB,当我们登录A系统后在登录B系统,我们打开浏览器调试模式方向两个系统只有一个sessionId,因为我们没有对二者的session名称以及存储的命名空间做区分,程序会认为就是自己可用的session。当我们推出B系统,注销session后。发现B系统的session也失效了,因为在redis中JSESSIONID对应的数据已经被设置过期了。

同理,如果两个系统想要不同的session过期时间,也存在相同的问题。所以,建议不同系统,session名称以及存储的命名空间设置为不同,当然相同系统的水平扩展实例的情况除外

针对命名空间,我们可以在配置文件上添加配置解决

spring.session.redis.namespace=xxxx

如果是注解方式的也可以在注解上设置

@EnableRedisHttpSession(redisNamespace="xxxx")

这样我们查看redis中就可以看到sping-session存储的key就变成了我们设置的值。

针对超时时间,注解方式提供了响应的设置

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)

但是配置文件方式并没有提供响应的直接设置。
我们可以采用javaconfig方式自定义策略来设置超时以及设置cookies名称,如下我们设置超时时间是1800秒,cookies名为MYSESSIONID

@Bean
public CookieHttpSessionStrategy cookieHttpSessionStrategy(){
    CookieHttpSessionStrategy strategy=new CookieHttpSessionStrategy();
    DefaultCookieSerializer cookieSerializer=new DefaultCookieSerializer();
    cookieSerializer.setCookieName("MYSESSIONID");//cookies名称
    cookieSerializer.setCookieMaxAge(1800);//过期时间(秒)
    strategy.setCookieSerializer(cookieSerializer);
    return strategy;
}

总结

通过以上步骤,我们就完成了分布式session的集成。相对于传统的内存方式,分布式session实现能够更方便水平扩展以及系统维护。对于不想立马更改系统采用token方式来进行验证的系统来说是一种简便、快速、低成本的一种实现思路。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
4月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
135 1
|
10天前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
|
12天前
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
43 5
|
14天前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
22 1
|
25天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
39 2
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
65 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
146 1
|
2月前
|
存储 前端开发 Java
Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能
本文详细介绍如何在Spring Boot项目中集成MinIO对象存储系统与KKFileView文件预览工具,实现文件上传及在线预览功能。首先搭建MinIO服务器,并在Spring Boot中配置MinIO SDK进行文件管理;接着通过KKFileView提供文件预览服务,最终实现文档管理系统的高效文件处理能力。
358 11
|
2月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
72 2