A.13 springboot session

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)

你可能感兴趣的:(A.13 springboot session)