【问题标题】:Does session stored in the databases really violate RESTfulness?存储在数据库中的会话真的违反了 RESTful 吗?
【发布时间】:2019-08-30 09:55:03
【问题描述】:

我读过很多文章说会话违反了REST 的无状态问题。

如果用户登录服务器,服务器将会话cookie(ssid)提供给客户端,并将会话数据(用户数据)存储在服务器中,在本例中为内存。

违反无国籍是有道理的。

但是数据库中的会话存储呢?

如果用户登录服务器,服务器将会话cookie(ssid)给客户端,并将会话数据存储在mysql数据库中,而不是在内存中。

这也违反了无国籍吗?

如果是真的,“数据库中的会话存储”和“查询数据库数据的用户请求”有什么区别?

当客户端发出请求时,它们都在从数据库中提取一些数据。

很明显,后者并没有违反无状态,否则REST架构永远不会那么受欢迎。

我之前的问题,RESTfulness violation regards to the database 回答者说“它没有违规”

反之亦然,Do sessions really violate RESTfulness? 回答者说“是的,它违反了”。但该答案可能绑定到唯一的服务器端(内存)。

好困惑。

【问题讨论】:

    标签: rest


    【解决方案1】:

    REST 中的无状态特别是refers 用于消息的自描述性。

    这意味着每个请求都必须包含服务器处理消息所需的所有信息。该请求不能引用先前的上下文请求。链接文档(Fielding 的论文,REST 的起源)很好地详细说明了为什么该限制对分布式系统有用。

    所以最终不管是在数据库中还是在服务器上的内存中,客户端都不能依赖先前建立的会话状态来进行后续请求。

    这样想:客户端可能会将其下一个请求延迟数天,或者客户端可能执行来自某种形式的书签的请求,或者该请求可能会转到与所有先前请求不同的服务器。或者它可能是客户提出的第一个请求。这一切都应该以完全相同的方式工作。

    另一个重要的一点是“会话状态”不同于存储在数据库中的与业务相关的事物(您似乎指的是)。当然,服务器可以在其数据库中存储与业务相关的内容,如果它愿意,它甚至可以存储或缓存(在内存中)登录数据或会话状态,这一切都很好。然而,客户端和服务器可能做的是使用先前请求的上下文“丰富”请求。

    因此客户端可能会请求对某个数据库执行查询,该数据库显然具有某种“状态”。它可能不会说:使用我之前提出的一些请求中指定的附加参数(如登录名)执行此查询。

    在某些情况下,这条线可能会变得模糊,例如当服务器允许为客户端创建“事务”作为资源时。但是,如果有疑问,请始终了解为什么您需要此属性,以及您希望在您的特定架构中从中获得什么价值。

    【讨论】:

    • 很好的解释!你能给我一个“'丰富'一个请求与先前请求的上下文的例子。”吗?我快到了。
    • 典型的例子当然是登录信息,例如用户名、权限或角色,这些信息是在先前发出的“登录”请求中确定的。但可以包括以下内容:您“当前”处理的业务实体(您正在服务的当前客户等)、上次执行的查询等。
    • 我还有一个问题,如果可以的话!在购物车会话的情况下怎么样?当客户端将商品放入购物车时,服务器会将该信息保存为会话。但正如您所说,似乎下一个请求可能与前一个上下文无关。用户存储的任何内容都不会影响下一个请求。所以它没有违反 REST 无状态。希望我理解正确!
    • 如果以这种方式实现,服务器上的购物车可能违反 REST 和无状态。但是通常它是服务器持有的与业务相关的状态,而不是服务器和客户端之间的通信状态,这可以。但是,正如我所说,有些事情归结为解释。理论上,您也可以将购物车存储在客户端上,这将使设计不那么模糊。两者都可以工作,并且如果处理得当,两者都与 REST 和无状态兼容。
    • “可能违反”是有道理的。保持灵活性也很重要,只是不修复遵循 REST 的实现。欣赏它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多