rest - 存储在数据库中的 session 真的违反了 RESTful 吗?

标签 rest

我读过很多文章说 session 违反了关于 REST 的无状态问题。 .

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

它违反了无国籍状态是有道理的。

但是数据库中的 session 存储呢?

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

这也违反无国籍吗?

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

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

很明显,后者不违反无国籍,否则REST建筑从未如此受欢迎。

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

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

如此迷茫。

最佳答案

REST 中的无状态性 refers到消息的自我描述性。

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

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

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

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

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

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

关于rest - 存储在数据库中的 session 真的违反了 RESTful 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55587156/

相关文章:

javascript - 环回: Store object from remote method for later reuse within the Server

java - Restful Web 服务出错

java - 选择多个文件并使用 Jersey 上传它们

json - Spring rest 模板无法从 text/html 转换

javascript - 安全 Ajax 调用 On Rest Api

android - 对于文件> 1mb,驱动器REST API返回400

node.js - 使用 Mongoose 库更新 Express JS 中的数据库架构

javascript - JQuery/Ajax 和 Spring Rest 多部分表单提交

rest - 使用 MVC Web API 的 RESTful api 教程系列

http - 如何强制 HTTP 客户端使用条件请求进行更新?