如何使java web应用程序完全无状态

如何使java web应用程序完全无状态,java,rest,jakarta-ee,architecture,stateless,Java,Rest,Jakarta Ee,Architecture,Stateless,我知道有很多关于有状态应用程序和无状态应用程序之间的区别的讨论,并且无状态是函数编程语言所做的,每个具有相同参数的函数调用都将返回相同的值 这是否意味着面向对象语言无法生成完全无状态的应用程序,因为每个对象通常都有状态 另外,在JavaWeb应用程序中,我们通常需要跟踪用户状态,这是由会话解决的。但如何在分布式系统中以无状态的方式实现这一点呢 当一个系统死亡时,我们需要另一个服务器以某种方式识别会话,以便传输用户状态。我们需要将会话放在中央数据库(缓存)中吗?但是这种方式是无状态的吗 在我们使J

我知道有很多关于有状态应用程序和无状态应用程序之间的区别的讨论,并且无状态是函数编程语言所做的,每个具有相同参数的函数调用都将返回相同的值

这是否意味着面向对象语言无法生成完全无状态的应用程序,因为每个对象通常都有状态

另外,在JavaWeb应用程序中,我们通常需要跟踪用户状态,这是由会话解决的。但如何在分布式系统中以无状态的方式实现这一点呢

当一个系统死亡时,我们需要另一个服务器以某种方式识别会话,以便传输用户状态。我们需要将会话放在中央数据库(缓存)中吗?但是这种方式是无状态的吗


在我们使JavaWeb应用程序成为无状态之前,除了会话之外,还有什么需要关注的呢

最简单的方法是将会话信息存储在某个键值存储中。请看这里:


要变成“真正的”无状态,必须根本没有会话。这意味着:用户将对每个请求进行身份验证,并且您必须检查每个请求的凭据。(它非常类似于会话数据库)

您不在服务器上存储任何客户机状态信息,而是将其传递到任何需要的地方,并在服务器需要更改时将其传递回客户机。这就是无状态的意思,没有状态。在客户端告诉客户状态是什么之前,服务器不应该有任何线索。客户可以告诉我们,我们不能把任何东西都存储在一个节点中(而是让客户机做身份或存储在一个节点中),这是无状态的吗?其他的呢?会话只是我关心的一个问题,类或者其他东西怎么样?@Jaskey不要把对象状态和用户特定的会话状态混淆起来。在应用程序中拥有有状态对象不是问题。一个问题是在多个请求之间将特定于用户的状态保留在内存中。一个典型的Web应用程序在每次请求时都会在数据库中获取和存储数据。@jbniset,虽然有人说服务器在db或memcache中保持状态,但它不是一个无状态的应用程序,就像inf3rno在它中的回答一样,它真的不应该管别人如何调用它,只要它按照您想要的方式工作。如果你的应用程序真的没有任何状态,只需确保你没有在应用程序中存储任何东西。这意味着:不使用静态属性,从不使用会话范围,始终使用请求范围。最“纯粹”的方法应该是使用HTTP基本身份验证,并在每个请求中针对DB验证凭据。但我要说的是,在登录时生成一个访问令牌,将令牌保存在某个地方,并让用户在每次请求时发送令牌是可以的。它与会话存储基本相同。