Spring Session

Rob Winch; Vedran Pavić; Jay Bryant; Eleftheria Stein-Kousathana

Spring Session 提供了一个 API 和多种实现,用于管理用户的会话信息。

Spring Session 提供了一个 API 和多种实现,用于管理用户的会话信息,同时可以轻松支持集群会话,而不受特定应用容器解决方案的限制。它还提供了与以下项的透明集成:

  • HttpSession:允许以一种不依赖应用容器的方式替换 HttpSession,并支持在请求头中提供会话 ID 以用于 RESTful API。

  • WebSocket:提供了在接收 WebSocket 消息时保持 HttpSession 活跃的能力

  • WebSession:允许以一种不依赖应用容器的方式替换 Spring WebFlux 的 WebSession

理解 Spring Session 解决的问题

当用户与 Web 应用程序交互时,服务器会创建一个会话来跟踪他们的活动。此会话可能存储信息,例如用户偏好、登录状态和购物车内容。然而,在分布式环境中,会话可能会出现问题,因为它们通常存储在服务器的内存中。

为了更好地理解 Spring Session 解决的问题,我们首先来看下面的图表

In-Memory Sessions
图 1. 内存中会话

在上面的图表中,每个 Spring 应用程序将其会话存储在只有自己能够访问的地方,通常是服务器的内存中,但这在分布式环境中可能会产生问题。想象一下,Spring App #2 接收到一个带有 Session #3 的请求,由于该会话数据存储在 Spring App #1 的内存中,Spring App #2 将无法读取这些数据。为了解决这个问题,我们需要实现某种共享会话存储,如下面的图表所示

Shared Session Storage
图 2. 共享会话存储

通过上述设置,对于能够访问会话存储的每个应用程序,会话都将变为可用。

Spring Session 在应用程序和会话管理之间提供了一个抽象层。它允许将会话数据存储在各种持久化存储中,例如关系型数据库、NoSQL 数据库等。

使用 Spring Session,您可以使用相同的 API 来管理会话,而无需考虑使用的持久化存储。这使得在不同存储之间切换变得更加容易,而无需更改应用程序代码。Spring Session 还提供了会话过期以及不同 Web 应用程序之间的跨上下文通信等功能。

总的来说,Spring Session 简化了 Web 应用程序中用户会话的管理,使您能够更容易地专注于构建应用程序的核心功能。

以下是 Spring Session 的一些常见用例

  • 分布式 Web 应用程序:如果您的 Web 应用程序分布在多个服务器上,管理用户会话可能会具有挑战性。Spring Session 可以通过将会话数据存储在共享数据库或 Redis 中来提供帮助,从而允许所有服务器访问和更新会话数据。

  • 会话可伸缩性:在具有许多并发用户的大型 Web 应用程序中,将 Sessions 存储在服务器内存中可能导致可伸缩性问题。Spring Session 允许您将会话数据存储在持久化存储中,从而提高可伸缩性并降低内存不足错误的风险。

  • 会话备份和恢复:将会话数据存储在持久化存储中还可以提供一种机制,用于在服务器故障或停机时备份和恢复会话数据。

Spring Session 社区

我们很高兴将您视为我们社区的一员。以下部分提供了有关如何与 Spring Session 社区互动的信息。

支持

您可以通过在 Stack Overflow 上使用 spring-session 标签提问来获得帮助。同样,我们鼓励您通过在 Stack Overflow 上回答问题来帮助他人。

源代码

您可以在 GitHub 上找到源代码,地址为 github.com/spring-projects/spring-session/

问题跟踪

我们在 GitHub issues 上跟踪问题,地址为 github.com/spring-projects/spring-session/issues

贡献

我们欢迎 pull requests

许可证

Spring Session 是根据 Apache 2.0 许可证发布的开源软件。

社区扩展

名称 地址

Spring Session Infinispan

infinispan.org/docs/stable/titles/spring/spring.html

Spring Session Caffeine

github.com/gotson/spring-session-caffeine

最低要求

Spring Session 的最低要求如下:

  • Java 17+。

  • 如果您在 Servlet 容器中运行(非必需),需要 Servlet 3.1+。

  • 如果您使用其他 Spring 库(非必需),最低要求版本为 Spring 6.0.x。

  • @EnableRedisHttpSession 需要 Redis 2.8+。这是支持 会话过期 所必需的。

  • @EnableHazelcastHttpSession 需要 Hazelcast 3.6+。这是支持 FindByIndexNameSessionRepository 所必需的。

从核心来看,Spring Session 仅依赖于 spring-jcl。有关不依赖于任何其他 Spring 库使用 Spring Session 的示例,请参阅hazelcast 示例应用程序。