美文网首页我爱编程
A.13 springboot session

A.13 springboot session

作者: 成长的键盘手 | 来源:发表于2018-02-23 16:16 被阅读0次

    1. 介绍

    spirng session 支持的特性

    • 集群 session。通常用于水平扩展后的集群 session 共享
    • 浏览器上多 session (一个浏览器多个session)
    • RESTful APIs 中提供 session
    • websocket 中提供 session
    • 在HTTP协议头中传递 session id,而不必须依赖 cookie

    参考资料

    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有:

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-gemfire</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-mongo</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    

    3.2 spirng session data redis

    在 spring boot 中通过 spring session 将 session 存储在redis,以达到回话共享的目的,为后期服务的水平扩展提供支撑。

    集成步骤:

    引入依赖

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

    连接 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

        本文链接:https://www.haomeiwen.com/subject/jrpxxftx.html