关于 REST 中的“无状态”的一个疑问。

2020-12-24 00:39:54 +08:00
 mitu9527

下面的内容引自 REST 论文原文:

We next add a constraint to the client-server interaction: communication must be stateless in nature, as in the client-stateless-server (CSS) style of Section 3.4.3 (Figure 5-3), such that each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client.

重点是最后一句,翻译过来就是“因此,会话状态完全保存在客户端上”。虽然出自官方,但我对此还是有疑问:

把会话数据存在客户端,也就是使用所谓的“客户端会话”真的算是“无状态”么?

我又去读了很多关于“无状态”的文章、帖子和回复,我看到不少人说这种确实是“无状态”,但我个人总觉得不对。客户端会话数据也是由服务端生成,最终也是由服务端读取,只不过没有被保存在服务端,而是被保存到了客户端,所以它和常见的“服务端会话”的区别只是存储的地方不一样(这种“去中心化”确实有它的好处,但缺点也不少),但作用完全是一样的,难道不是么?

把会话数据从客户端传给服务端,然后服务端读取传过来的会话数据并进行使用,这不也是在读取本次交互过程(或者说会话)中前面某个请求所产生的数据么?那请求和请求之间还算是互相独立么?说好的“人生只如初见”呢?

现在的我觉得如果要“无状态” ,就绝对不应该有“会话”这个概念,不论是“服务端会话”还是“客户端会话”,都不应该存在,感觉使用“客户端会话”来符合“无状态”有点像掩耳盗铃似的。

最后在重复一遍问题:把会话数据存在客户端,也就是使用所谓的“客户端会话”真的算是“无状态”么?

5959 次点击
所在节点    程序员
82 条回复
wzwb
2020-12-24 17:32:11 +08:00
@mitu9527 算了算了,不说了。如果你能明白 Basic username:password = OpaqueToken = sessionId = 等于你说的 jwt 里存用户 id,都是一种用户标识,都需要再次查询才能获取用户信息,你就知道你这种方案只是重新发明了一遍服务端会话,本质上是一种东西。
mitu9527
2020-12-24 17:42:45 +08:00
@ZSeptember 今天回答的问题太多,算了,就这样吧,没必要再讨论了,恐怕也讨论不出给所以然来。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/738435

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX