暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Session会话管理

毫末之木 2021-08-05
2323

概述

Spring Session提供了用户会话管理的API和实现

特性

Spring Session支持集群会话管理解决方案,且无需绑定到特定的应用程序容器。

提供一些透明的集成:

  • HttpSession
    - 在容器(tomcat)中性方式替换HttpSession,提供session id在header中和restful API一起使用。

  • WebSocket
    - 提供了在WebSocket接收消息的时,保持HttpSession alive的能力。

  • WebSession
    - 允许在应用程序容器用中立的替换 Spring WebFlux 的 WebSession。

组成模块

  • Spring Session Core - 核心功能和API

  • Spring Session Data Redis - 提供Redis支持的SessionRepository和ReactiveSessionRepository实现和配置支持

  • Spring Session JDBC - 提供关系型数据库的SessionRepository实现和配置支持。

  • Spring Session Hazelcast - 提供Hazelcast的SessionRepository实现和配置支持。

总之:spring session实现了对redis、jdbc、hazelcast、mongdb、apache geode会话管理的支持。当前web应用分为Servlet Web应用和Recative web应用,对Reactive的支持提供自动配置支持Redis和MongoDB。

示例

所有示例基于Version 2.5.1

Spring Boot整合Redis会话管理

SpringBoot整合redis做session共享

1、添加maven依赖

<dependency>
   <groupId>org.springframework.session</groupId>
   <artifactId>spring-session-data-redis</artifactId>
</dependency>
复制

2、Spring Boot配置

application.properties

spring.session.store-type=redis # 会话存储类型配置声明。
# 该配置相当于手动添加了@EnableRedisHttpSession注解。(同理这一类注解还有针对其他存储方式的注解@Enable*HttpSession。)该注解会启动创建一个Filter-springSessionRepositoryFilter.该filter负责替换HttpSession为SpringSession。
# 如果是反应式的web应用,则相当于手动添加@Enable*WebSession
# 这以上的配置spring session都做了自动配置。
# 如果要禁用spring session可以配置如:spring.session.store-type=none

server.servlet.session.timeout = # 会话超时。如果未指定持续时间后缀,则使用秒。
# 关于会话超时设置优先级问题注意:可以通过`spring.session.timeout`设置过期时间。如果Servlet Web没有设置该属性,则自动配置退回server.servlet.session.timeout

spring.session.redis.flush-mode=on_save # 会话刷新模式。
spring.session.redis.namespace=spring:session # 用于存储会话的键的命名空间。
复制

注意:配置具有优先级,优先级从高到低:@Enable*Session
>spring.session.timeout
>server.servlet.session.timeout
。注解配置如:@Enable*HttpSession(Servlet)
@Enable*WebSession(Reactive)
配置。如果使用了注解配置,则配置文件中自动配置会自动退出。具体的属性配置如timeout等可以使用注解的属性进行配置。示例:@EnableJdbcHttpSession(maxInactiveIntervalInSeconds = 1800)
配置了过期时间为1800秒。

3、配置redis连接

spring.redis.host=localhost # Redis server host.
spring.redis.password= # Login password of the redis server.
spring.redis.port=6379 # Redis server port.
复制

更多配置信息参考:https://docs.spring.io/spring-boot/docs/2.4.7/reference/htmlsingle/#boot-features-connecting-to-redis

4、Servlet容器初始化

以上springboot的配置做了什么,底层的逻辑是,spring boot自动配置创建了一个Filter,springSessionRepositoryFilter的bean,该bean负责用Spring Session替换HttpSession。

spring需加载配置类,springSessionRepostiryFilter
对所有请求过滤,以上动作都由springboot自动完成。


文章转载自毫末之木,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论