当他们说http是无状态的时,这意味着什么?

2022-09-01 03:33:45

我正在为web学习java,它提到http是无状态的。这意味着什么以及它如何影响编程

我还在研究弹簧框架,在那里它提到一些豆子必须声明为内部豆子,因为它们的状态发生变化 。这是什么意思?


答案 1

HTTP--即服务器和客户端之间的实际传输协议-是“无状态的”,因为它在调用之间不记得任何东西。通过 HTTP 访问的每个资源都是单个请求,它们之间没有线程连接。如果加载的网页包含一个 HTML 文件,其中包含三个标记,命中同一服务器,则将协商并打开四个 TCP 连接,四个数据传输,关闭四个连接。在协议级别,服务器上根本没有保留任何状态,可以让服务器在您进入时了解您的任何事情。<img>

(好吧,无论如何,对于1.0的HTTP来说都是如此。HTTP 1.1添加了各种持久的连接机制,因为真正的无状态协议不可避免地会产生性能问题。我们暂时忽略这一点,因为它们并没有真正使HTTP成为有状态的,他们只是让它变得肮脏无状态而不是纯无状态。

为了帮助您理解其中的区别,假设像 Telnet 或 SSH 这样的协议是无状态的。如果要获取远程文件的目录列表,则必须作为一个原子操作进行连接、登录、更改目录并发出命令。当命令显示完目录内容时,连接将关闭。如果随后想要显示特定文件的内容,则必须再次连接、登录、更改目录,然后发出命令。显示文件的命令完成后,连接将再次关闭。lslscat

当你以这种方式看待它时,虽然Telnet / SSH的镜头,这听起来很愚蠢,不是吗?好吧,在某些方面它是,在某些方面它不是。当协议是无状态的时,服务器可以做一些非常好的优化,数据可以很容易地分散。使用无状态协议的服务器可以非常有效地扩展,因此,虽然实际的单个数据传输可能非常慢(打开和关闭TCP连接并不便宜!),但整个系统可以非常非常高效,并且可以扩展到任意数量的用户。

但。。。

除了查看静态网页之外,您想做的几乎任何事情都将涉及会话和状态。当HTTP用于其原始目的(共享科学论文等静态信息)时,无状态协议非常有意义。当您开始将其用于Web应用程序,在线商店等内容时,无状态开始成为麻烦,因为这些本质上是有状态的活动。结果,人们很快就想出了在无状态协议之上涂抹状态的方法。这些机制包括诸如cookie之类的东西,例如URL中的编码状态,以及让服务器根据这些内容动态启动数据,例如隐藏状态请求,例如...嗯,就像一大堆东西一样,包括更现代的东西,如Web Sockets。

以下是您可以遵循的一些链接,以更深入地了解这些概念:


答案 2

HTTP是无状态的 - 这意味着当使用HTTP时,端点不会“记住”事情(比如你是谁)。它没有状态。这与桌面应用程序相反 - 如果您有一个表单并且转到其他表单,然后返回,则状态已保留(只要您尚未关闭应用程序)。

通常,为了维护Web应用程序中的状态,可以使用cookie。


推荐