Web应用程序应该是无状态的
废话。Web 请求应该是无状态的。或更准确地说,Web请求是无状态的。
但是,说整个应用程序应该是无状态的完全是胡说八道。
每个请求都被视为独立交易。
是的,完全是。或者更准确的说,是的,一定。通过HTTP,每个请求本质上独立于所有其他请求。向HTTP添加“状态”要求您为每个“状态”请求显式标识,存储和检索“状态”。这会费力,降低性能并增加复杂性。
而且,由于这些原因,每个可能是无状态的请求都应该是无状态的。
因此,应避免使用Session和Cookies(因为它们都是有状态的)。更好的方法是使用令牌
一些事项:令牌也可以绑定到会话存储。Cookies不会需要被束缚到会话存储。令牌通常存储在cookie中。而且,有时会话只是工作的正确工具。
这意味着,至少有时,会话和cookie与令牌一样“更好”!
[令牌]是无状态的,因为服务器上没有存储任何内容。
好吧,就是这样。这就是“无国籍”教条的真正含义。虽然,很明显,这不是要在服务器上存储“空”,而是要在服务器上不存储会话状态。
例如,我的Gmail收件箱处于状态。而且最好将其存储在服务器上!但是,这不是会话状态。
因此,与其让服务器使用一个很小的标识符来弄清楚自己是谁,等等,无状态应用程序还想提醒您自己是谁,以及每个血腥的请求在做什么。应用程序状态仍然存在,客户端只负责保持它。
现在,如果该状态很小,那可能就可以了。在某些情况下,它非常好。
然后,当然,有些事情我们只是希望成为有状态的...
当有会话要保留的数据(例如购物车中的物品)时,Web应用程序如何变为无状态?这些实际上存储在某个地方的数据库中,然后定期清除吗?
两种选择。您正在开会或被拒绝!
... 不过实话说。您通常不会将购物车存储在Cookie中。诸如购物车之类的东西将被存储在“传统”会话中,或者将被存储为Cart
对象,并带有服务器用来将其拉入后续请求的某种ID。有点像..呃...错误... 会话。
真的很认真:在很大程度上,当两个通信代理可以将对话中的消息上下文化时,“状态”就是我们所说的。传统上理解的会话就是我们通常所说的发生机制。
我认为,无论您对服务器处理的每个请求使用令牌还是“会话”,您都需要将该请求上下文化以实现它,或者不这样做。如果不需要上下文,请不要获取它。如果上下文是必要的,则最好将其放在附近!
然后作为一个相关问题,主要网站(亚马逊,谷歌,Facebook,Twitter等)是否实际上是无状态的?他们使用令牌还是cookie(或两者都使用)?
可能两者都有。但是,总的来说,它们确实可以完成您的工作:他们设置cookie来识别大型“会话”数据库中的“状态”记录。
我怀疑,如果可能的话,他们会将基本身份声明推入短暂的“令牌”中,以避免在集中式存储上发生不必要的争执。但是,许多服务允许我“注销所有其他位置”这一事实可以很好地表明,如果它们完全使用令牌,那么它们至少会得到半传统会话模型的“支持”。 。