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`。

Understanding the Problem That Spring Session Solves

当用户与 Web 应用程序交互时,服务器创建会话来跟踪他们的活动。此会话可能存储用户信息(如用户首选项、登录状态和购物车内容)。但是,由于会话通常存储在服务器的内存中,因此在分布式环境中可能会出现问题。

为了更好地理解 Spring Session 解决的问题,我们首先可视化以下图表:

inmemory sessions
Figure 1. In-Memory Sessions

在上图中,每个 Spring 应用程序都将会话存储在仅他们自己可访问的地方,通常在服务器的内存中,但这在分布式环境中可能存在问题。想象一下 Spring App #2 收到具有会话 #3 的请求的情况,该应用程序将无法读取会话数据,因为它存储在 Spring App #1 的内存中。要解决此问题,我们需要实现某种共享会话存储,如我们在下图中看到的:

shared session storage
Figure 2. Shared Session Storage

通过上述设置,会话对可访问会话存储的每个应用程序均可用。

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

使用 Spring Session,您可以使用相同的 API 来管理会话,而无需考虑使用的永久化存储。这样,无需更改应用程序代码即可在存储之间轻松切换。Spring Session 还提供诸如会话过期和不同 Web 应用程序之间的跨上下文通信等功能。

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

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

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

  • 会话可扩展性: 在拥有许多并发用户的大型 Web 应用程序中,在服务器上将会话存储于内存中会导致可扩展性问题。Spring 会话允许你将会话数据存储在持久存储区,从而改善可扩展性并降低出现内存溢出错误的风险。

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

Spring Session Community

我们很高兴您成为我们社区的一员。以下部分提供了有关如何与 Spring 会话社区互动的一些附加信息。

Support

您可以标记请求 link:https://stackoverflow.com/questions/tagged/spring-session[Stack Overflow with the spring-session 部分来获得帮助。同样,我们鼓励在 Stack Overflow 上回答问题来帮助他人。

Source Code

你可以在 [role="bare"][role="bare"]https://github.com/spring-projects/spring-session/ 上的 GitHub 中找到源代码。

Issue Tracking

我们在 [role="bare"][role="bare"]https://github.com/spring-projects/spring-session/issues 上的 GitHub 中跟踪问题。

Contributing

我们感谢 pull requests

License

Spring Session 是在 Apache 2.0 license 下发布的开源软件。

Community Extensions

Name Location

Spring Session Infinispan

[role="bare"]https://infinispan.org/docs/stable/titles/spring/spring.html

Spring Session Caffeine

[role="bare"]https://github.com/gotson/spring-session-caffeine

Minimum Requirements

Spring 会话的最低要求是:

  • 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 sample 应用程序。