跳到主要内容

Spring Session

QWen Max 中英对照 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应用#2接收到一个带有会话#3的请求,该应用程序将无法读取会话数据,因为这些数据存储在Spring应用#1的内存中。为了解决这个问题,我们需要实现某种共享会话存储,如下图所示:

共享会话存储

图 2. 共享会话存储

通过上述设置,会话将对所有可以访问会话存储的应用程序可用。

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

使用 Spring Session,无论使用哪种持久化存储,你都可以使用相同的 API 来管理会话。这使得在不更改应用程序代码的情况下切换存储变得更加容易。Spring Session 还提供了诸如会话过期和不同 Web 应用程序之间的跨上下文通信等功能。

总体而言,Spring Session 简化了 Web 应用程序中用户会话的管理,使你能够更专注于构建应用程序的核心功能。

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

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

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

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

Spring Session 社区

我们很高兴你成为我们社区的一员。以下章节提供了关于如何与 Spring Session 社区互动的更多信息。

支持

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

源代码

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

问题跟踪

我们在 github.com/spring-projects/spring-session/issues 的 GitHub issues 中跟踪问题。

贡献

我们感谢 pull requests

许可证

Spring Session 是开源软件,采用 Apache 2.0 许可证 发布。

社区扩展

最低要求

Spring Session 的最低要求是:

  • Java 17+。

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

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

  • @EnableRedisHttpSession 需要 Redis 2.8+。这是为了支持 Session Expiration

  • @EnableHazelcastHttpSession 需要 Hazelcast 3.6+。这是为了支持 FindByIndexNameSessionRepository

备注

在最核心的部分,Spring Session 仅依赖于 spring-jcl。有关在不使用其他 Spring 依赖的情况下使用 Spring Session 的示例,请参见 hazelcast 示例 应用程序。