我读过许多文章说会话违反了REST
的无状态方面的考虑。
如果用户登录服务器,则服务器将会话cookie(ssid)提供给客户端,并将会话数据(用户数据)存储在服务器中,在这种情况下为内存。
这违反了无国籍状态。
但是会话存储在数据库中如何?
如果用户登录服务器,则服务器将会话cookie(ssid
)分配给客户端,并将会话数据存储在mysql数据库中,而不是存储在内存中。
这是否也在侵犯无国籍状态?
如果为true,则“会话存储在数据库中”和“正在查询数据库数据的用户请求”之间有什么区别?
当客户发出请求时,他们俩都从数据库中提取了一些数据。
很明显,后者不会违反无状态性,否则REST
架构将永远不会如此流行。
我之前的问题RESTfulness violation regards to the database的回答者说“它没有违反”
反之亦然,Do sessions really violate RESTfulness?回答者说“是的。”但是该答案可能绑定到唯一的服务器端(内存)。
好困惑。
答案 0 :(得分:3)
REST中的无状态专门针对消息的自我描述refers。
这意味着每个请求必须包含服务器处理消息所需的所有信息。该请求不能引用先前的上下文请求。链接的文档(Fielding的论文,REST的起源)非常详细地说明了为什么为什么限制对分布式系统有用。
因此,最终无论数据库中还是服务器上的内存中都没有关系,客户端不得依赖先前建立的对话状态来进行后续请求。
这样考虑:客户端可能将其下一个请求延迟几天,或者客户端可能会通过某种形式的书签执行请求,或者该请求可能会与所有先前的请求一起转到其他服务器。也可能是客户提出的第一个请求。所有这些都应该以完全相同的方式工作。
另一个重要的一点是,“会话状态”不同于存储在数据库中的业务相关事物(您似乎在引用)。当然,服务器可以在其数据库中存储与业务相关的内容,如果愿意,它甚至可以存储或缓存(在内存中)登录数据或会话状态,这一切都很好。客户端和服务器可能不会做的是利用先前请求中的上下文“丰富”请求。
因此,客户端可以请求对某些数据库执行查询,该数据库显然具有某些“状态”。它可能不会说:用我之前提出的某些请求中指定的其他参数(例如登录名)执行此查询。
在某些情况下,例如当服务器允许为客户端创建“交易”作为资源时,此行可能会模糊。但是,如果有疑问,请始终为什么知道该属性,以及在特定体系结构中希望从中获得什么价值。