SpringBoot集成redis实现共享存储session
作者:咸鱼不闲.s
redis实现共享存储session
- 首先下载redis,我下载的版本是5.0.14,目前官网貌似找不到5.x版本,可以自行去网上寻找。我这里的springboot版本是2.6.4
- 引入redis依赖
<!-- 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>
- 引入 spring-session 和 redis 的整合
<!-- 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>
- 修改 spring-session 存储配置
spring.session.store-type
spring: session: timeout: 86400 #过期时间:24h store-type: redis #存储类型redis
正常做完这些就可以实现共享存储session
但是我遇到一些问题:
自定义的Session存储库(SessionRepository)和@EnableRedisHttpSession注解冲突
配置好redis -session但是登录后,redis中并没有存储session
原因: 在之前解决跨域访问出现的Set-Cookie:SameSite=Lax 问题是,在网上引入了SessionConfig 配置类:
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中
到此这篇关于SpringBoot集成redis实现共享存储session的文章就介绍到这了,更多相关SpringBoot redis共享session内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!