如果REST应用程序应该是无状态的,那么如何管理会话?

如果REST应用程序应该是无状态的,那么如何管理会话?,rest,session-state,Rest,Session State,我需要一些澄清。我一直在阅读有关REST和构建RESTful应用程序的书籍。根据维基百科,REST本身被定义为代表性状态转移。因此,我不理解所有这些无状态的狼吞虎咽的书,每个人都在不停地吐 来自维基百科: 在任何特定时间,客户机都可以在 应用程序状态或“静止”。处于rest状态的客户端能够 与用户交互,但不创建任何负载,也不消耗每个客户端的任何资源 服务器集或网络上的存储 他们只是说不要使用会话/应用程序级数据存储吗 我知道REST的一个目标是使URI访问一致且可用,例如,而不是将分页请求隐藏在

我需要一些澄清。我一直在阅读有关REST和构建RESTful应用程序的书籍。根据维基百科,REST本身被定义为代表性状态转移。因此,我不理解所有这些无状态的狼吞虎咽的书,每个人都在不停地吐

来自维基百科:

在任何特定时间,客户机都可以在 应用程序状态或“静止”。处于rest状态的客户端能够 与用户交互,但不创建任何负载,也不消耗每个客户端的任何资源 服务器集或网络上的存储

他们只是说不要使用会话/应用程序级数据存储吗

我知道REST的一个目标是使URI访问一致且可用,例如,而不是将分页请求隐藏在POST中,使请求的页码成为get URI的一部分。对我来说有道理。但它似乎只是说不应该在服务器端存储每客户机数据(会话数据)太过火了

如果我有一个消息队列,并且我的用户希望读取消息,但在读取消息时,希望在会话期间阻止某些发件人发送消息,该怎么办?将其存储在服务器端的某个位置,让服务器只发送未被用户阻止的消息(或消息ID),这难道没有意义吗

每次请求新邮件列表时,我真的必须发送整个邮件发送者列表以阻止吗?与我相关的消息列表一开始甚至不应该是公开的资源

再一次,我只是想理解这一点。请有人澄清一下


更新:

我发现了一个堆栈溢出问题,它的答案并不能让我完全理解: 也就是说,重要的客户端状态应该在每次请求时都被转移。。。。Ugg。。好像有很多开销。。。这是对的吗?

基本的解释是: 服务器上没有客户端会话状态

无状态意味着服务器不在服务器端存储有关客户端会话的任何状态

客户端会话存储在客户端上。服务器是无状态的,这意味着每个服务器可以随时为任何客户机提供服务,没有会话关联或粘性会话。相关会话信息存储在客户机上,并根据需要传递给服务器

这并不排除web服务器与之对话的其他服务维护有关业务对象(如购物车)的状态,只是不涉及客户端的当前应用程序/会话状态

客户端的应用程序状态永远不应该存储在服务器上,而是从客户端传递到需要它的每个地方

这就是REST中的ST的来源,状态转移。您可以四处传输状态,而不是让服务器存储它这是扩展到数百万并发用户的唯一方法。如果没有其他原因,那就是因为数百万个会话就是数百万个会话

会话管理的负载在所有客户机上分摊,客户机存储其会话状态,服务器可以以无状态方式为多个数量级或更多的客户机提供服务

即使对于一个您认为只需要10万并发用户的服务,您仍然应该使您的服务成为无状态的。数以万计的人仍然是数以万计的,这将带来时间和空间成本

无状态是HTTP协议和web通常被设计为如何运行的,是一个总体上更简单的实现,您有一个单一的代码路径,而不是一堆服务器端逻辑来维护一堆会话状态

有一些非常基本的实施原则: 这些是原则而不是实现,您如何满足这些原则可能会有所不同

总括而言,有关建议如下:

  • 给每个“东西”一个ID
  • 把事情联系起来
  • 使用标准方法
  • 具有多个表示形式的资源
  • 无状态通信
  • 其余部分中没有关于身份验证或授权的内容。 因为对RESTful请求和非RESTful请求进行身份验证没有什么不同。身份验证与RESTful讨论无关

    解释如何为您的特定需求创建无状态应用程序对于StackOverflow来说太宽泛了

    与REST相关的身份验证和授权的实现更为广泛,通常在internet上详细解释了各种实现方法

    请求此帮助/信息的评论将/应标记为 不再需要

    他们只是说不要使用会话/应用程序级数据存储吗

    不,他们不是用一种琐碎的方式说的

    他们说不要定义“会话”。不要登录。不要注销。为请求提供凭据。每个请求都是独立的

    您仍然有数据存储。您仍然拥有身份验证和授权。您不会浪费时间建立会话和维护会话状态

    关键是,每个请求(a)都是完全独立的,而(b)可以轻松地分配到一个大型并行服务器场,而无需任何实际工作。Apache或Squid可以盲目而成功地传递RESTful请求

    如果我有一个消息队列,并且我的用户希望读取消息,但在读取消息时,希望在会话期间阻止某些发件人发送消息,该怎么办

    如果用户需要过滤器,那么只需在每个请求上提供过滤器即可

    难道不应该。。。让服务器只发送未被阻止的邮件(或邮件ID)