如何制作无状态的 Web 应用程序?特别是使用 Spring MVC?

smw*_*dia 2 session spring spring-mvc session-state stateless

无状态 Web 应用程序似乎很有前途。如何制作一个?尤其是 Spring WebMvc?有什么指导方针吗?

以下是我的一些想法:

  • 避免创建会话
  • 使用集中存储状态信息并在 Web 应用程序实例之间共享。

添加 1

我认为这不是是否保留状态信息的问题。如果你想做一些有用的事情,状态信息总是必要的。这实际上是一个在哪里/如何保留状态信息的问题。这篇文章很有用。它提到了进程内/进程外会话、数据缓存以及为什么不使用会话。

有关的:

使用 Spring MVC 进行无状态 Web 应用程序开发 (尚未响应)

无状态 Spring MVC

如何使 Java Web 应用程序完全无状态

如何使我的 Web 应用程序无状态但仍然做一些有用的事情?

http://brockallen.com/2012/04/07/think-twice-about-using-session-state/

Ren*_*rro 6

这里有一些贡献。我不熟悉 Java 和 Spring,但我相信无论您的技术堆栈如何,这些指南都是有效的。

远离会话进行身份验证

正如您在问题中所预期的那样,避免使用会话来验证用户。会话是强制性的,很难在分布式、可扩展的基础设施中一致地复制它。

此外,负载平衡器不适用于会话:请参阅负载平衡服务器上的会话状态超时问题

使用基于令牌的身份验证系统

无状态应用最好使用基于令牌的身份验证系统。Firebase就是一个很好的例子。将从令牌中提取的不可变用户 ID 映射到您要使用的任何存储机制中持久化的用户数据。由于此用户 ID 不会更改,因此您可以在分布式数据库中使用。

不要将无状态与“数据持久性”混淆

有时人们认为,通过将用户 ID 映射到数据库中的用户数据,您正在制作一个有状态的应用程序。这不是真的。让我说清楚:

将用户信息保存在数据库中并对经过身份验证的用户进行动态响应的应用程序不是必需的。无状态意味着应用程序不必跨多个服务器分发可变身份验证会话,也不会根据会话数据将其内部状态更改为特定客户端。

无状态的技巧是:一旦用户通过登录验证了它的令牌,服务器就不必在数据库服务器之间分发任何新的东西,它也不会将其状态更改为该客户端。它可以从令牌中提取用户信息并执行响应请求所需的操作。如果令牌过期,客户端将需要新的身份验证,这将生成一个新的令牌,但这与应用服务器隔离,因为用户 ID 将保持不变。

使用 cookie 进行缓存,同时保持无状态

如果在 cookie 中缓存一些经常请求的数据会提高性能,那很好,继续缓存。只需确保 cookie 未连接到任何服务器状态,如果客户端丢失 cookie,您的应用程序不会中断。