1. 介绍
spirng session 支持的特性
- 集群 session。通常用于水平扩展后的集群 session 共享
- 浏览器上多 session (一个浏览器多个session)
- RESTful APIs 中提供 session
- websocket 中提供 session
- 在HTTP协议头中传递 session id,而不必须依赖 cookie
参考资料
- https://docs.spring.io/spring-session/docs/1.2.2.RELEASE/reference/html5/
- https://docs.spring.io/spring-boot/docs/1.4.7.RELEASE/reference/htmlsingle/#boot-features-session
spring session 支持的存储方式
- redis
- jdbc
- mongo
- hazelcast
- hashmap
- none
参见:org.springframework.boot.autoconfigure.session.StoreType
2. spring boot 原生 session
由于spring boot 集成了tomcat,所以 session 自然由 tomcat 进行管理。
由于在 spring-boot-starter-web 包中依赖了 spring-boot-starter-tomcat 的包,所以在 POM 中没有显示的引入 spring-boot-starter-tomcat。
关于 tomcat 的 session 管理相关的配置如下:
server.session.cookie.comment= # Comment for the session cookie.
server.session.cookie.domain= # Domain for the session cookie.
server.session.cookie.http-only= # "HttpOnly" flag for the session cookie.
server.session.cookie.max-age= # Maximum age of the session cookie in seconds.
server.session.cookie.name= # Session cookie name.
server.session.cookie.path= # Path of the session cookie.
server.session.cookie.secure= # "Secure" flag for the session cookie.
server.session.persistent=false # Persist session data between restarts.
server.session.store-dir= # Directory used to store session data.
server.session.timeout= # Session timeout in seconds.
server.session.tracking-modes= # Session tracking modes (one or more of the following: "cookie", "url", "ssl").
3. spring boot 集成 spring session
3.1 介绍
spring boot 也提供了对spring session的自动装配。
spring boot 对spring session 提供的pom有:
org.springframework.session
spring-session-data-gemfire
org.springframework.session
spring-session-data-mongo
org.springframework.session
spring-session-jdbc
org.springframework.session
spring-session-data-redis
3.2 spirng session data redis
在 spring boot 中通过 spring session 将 session 存储在redis,以达到回话共享的目的,为后期服务的水平扩展提供支撑。
集成步骤:
引入依赖
org.springframework.boot
spring-boot-starter-redis
org.springframework.session
spring-session-data-redis
连接 redis
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
spring.redis.host=192.168.137.101
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
spring session 配置
# 配置session的超时时间,也可以使用spring.session.timeout进行配置
server.session.timeout=3600
#spring.session.timeout=3600
# sping session 存储在redis中的命名空间,防止多应用公用一个redis时,session 的 key 冲入的问题
#spring.session.redis.namespace=session
# spring session 存储的类型,如果pom中只引入了spring-session-data-redis可以不用配置该项
spring.session.store-type=REDIS
# session 的刷新方式:ON_SAVE(在 response commit的时候)、IMMEDIATE(在 session.setAttrabute的时候)。默认:ON_SAVE
# spring.session.redis.flush-mode=
4. 常见问题
4.1 其他方式的 session 共享
使用 mongodb、jdbc 等都是将 session 外置持久化而达到共享的目的,其集成方式和 spirng session data redis 类似
4.2 超时设置
在 spring boot 环境中,无论是使用spring 原生的容器管理 session 还是使用 spring session 都可以使用 server.session.timeout 设置 session 的超时时间。
注意:
- 如果引入了 spring session 也可以使用 spring.session.timeout 进行超时配置。
- spring.session.timeout 的优先级高于 server.session.timeout
- 如果增加了 @EnableRedisHttpSession 注解,则server.session.timeout / spring.session.timeout 都不会生效,需要通过注解的属性来设置超时时间:
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 3600)