spring boot集成redis实现共享存储session

spring boot集成redis实现共享存储session

redis实现共享存储session

  1. 首先下载redis,我下载的版本是5.0.14,目前官网貌似找不到5.x版本,可以自行去网上寻找。我这里的springboot版本是2.6.4
  2. 引入redis依赖
xml 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.6.4</version>
</dependency>
  1. 引入 spring-session 和 redis 的整合
xml 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>2.6.3</version>
</dependency>
  1. 修改 spring-session 存储配置 spring.session.store-type
yml 复制代码
spring:
  session:
    timeout: 86400 #过期时间:24h
    store-type: redis #存储类型redis

正常做完这些就可以实现共享存储session

但是我遇到一些问题:


自定义的Session存储库(SessionRepository)和@EnableRedisHttpSession注解冲突

配置好redis -session但是登录后,redis中并没有存储session

原因: 在之前解决跨域访问出现的Set-Cookie:SameSite=Lax 问题是,在网上引入了SessionConfig 配置类:

java 复制代码
import org.springframework.boot.autoconfigure.session.DefaultCookieSerializerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.MapSessionRepository;
import org.springframework.session.SessionRepository;
import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession;
import org.springframework.session.web.http.DefaultCookieSerializer;
 
import java.util.concurrent.ConcurrentHashMap;
 
@Configuration
@EnableSpringHttpSession
public class SessionConfig {
    @Bean
    public SessionRepository sessionRepository() {
        return new MapSessionRepository(new ConcurrentHashMap<>());
    }
 
    @Bean
    DefaultCookieSerializerCustomizer cookieSerializerCustomizer() {
        return new DefaultCookieSerializerCustomizer() {
            @Override
            public void customize(DefaultCookieSerializer cookieSerializer) {
                cookieSerializer.setSameSite("None");
                cookieSerializer.setUseSecureCookie(true);
            }
        };
    }
}

可以看到该配置类里面引用了@EnableSpringHttpSession注解,并且建了一个名为sessionRepository的Bean,其作用是为Spring应用程序配置一个自定义的Session存储库(SessionRepository)。

使用了MapSessionRepository,它是Spring Session提供的一种内存存储方式,用于将Session数据存储在JVM内存中。通过传入ConcurrentHashMap作为构造函数的参数,实际上是在内存中创建了一个并发安全的Map,用于存储Session对象。

通常情况下,默认情况下Spring Session会将Session存储在类似Redis、MongoDB等外部持久化存储中,但是通过这段代码,我们可以将Session存储在内存中,这对于某些特定场景(比如开发和测试)可能会很有用。

但是现在,我们已经在application.yml配置文件中配置存储类型是redis,这导致SessionConfig中的sessionRepository覆盖掉了配置文件中的配置,导致session并没有存储到redis中 。

同时,如果在application.yml配置文件中配置已经配置好了session,就不要使用@EnableSpringHttpSession注解,我添加以后出现了以下报错

意思是我定义了重复的bean,@EnableRedisHttpSession注解和application.yml文件中的session配置存在冲突,特别是在指定存储类型、超时时间等方面。两者的配置不一致或冲突,导致应用程序对Session的处理出现问题。

现在去掉sessionRepository方法和@EnableRedisHttpSession注解,在进行测试,session成功存储在redis中

相关推荐
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 38--Allure 测试报告
python·学习·测试工具·pytest
一 乐8 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
好奇龙猫8 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
Boilermaker19928 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
saoys8 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
Cherry的跨界思维8 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_999 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子9 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
码事漫谈9 小时前
Protocol Buffers 编码原理深度解析
后端
sheji34169 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java