我正在研究Java for Web,它提到http是无状态的。这是什么意思,以及它如何影响编程
我也在研究spring框架,它提到了一些Bean,因为它们的状态发生了变化,它们必须声明为内部Bean。那是什么意思
HTTP(服务器与客户端之间的实际传输协议)是“无状态的”,因为它在调用之间不记忆任何内容。 通过HTTP访问的 每个 资源都是单个请求,它们之间没有线程连接。如果使用HTML文件加载网页,该HTML文件中包含<img>指向同一服务器的三个标记,则将协商并打开四个TCP连接,四个数据传输,四个连接关闭。 协议 级别 的服务器 上 __根本没有任何状态可以让服务器 在 您进入时对您有任何了解。
<img>
(嗯,无论如何,对于高达1.0的HTTP都是如此。HTTP1.1添加了各种持久连接机制,因为真正的无状态协议会带来不可避免的性能问题。我们暂时将其忽略,因为它们并没有真正使HTTP成为有状态的,它们只是使它变为无状态的脏状态,而不是纯粹的无状态的代码。)
为了帮助您了解两者之间的区别,请设想Telnet或SSH等协议是无状态的。如果要获取远程文件的目录列表,则必须执行一次原子操作,即连接,登录,更改目录并发出ls命令。当ls命令完成显示目录内容后,连接将关闭。然后,如果您想显示特定文件的内容,则必须再次连接,登录并切换到目录,然后发出cat命令。当显示文件的命令完成时,连接将再次关闭。
ls
cat
当您以这种方式看时,虽然Telnet / SSH听起来很愚蠢,不是吗?好吧,在某些方面它是事实,在某些方面不是。当协议是无状态的时,服务器可以进行一些非常好的优化,并且数据可以轻松地散布。使用无状态协议的服务器可以非常有效地扩展,因此,尽管实际的单个数据传输可能非常慢(打开和关闭TCP连接并不便宜!),但是整个系统可以非常非常高效,并且可以扩展到任意数量的用户。
但…
除了查看静态网页之外,几乎您要执行的其他任何操作都将涉及会话和状态。当HTTP用于其原始目的(共享静态信息,如科学论文)时,无状态协议很有用。当您开始将它用于Web应用程序,在线商店等时,无状态便开始变得麻烦,因为它们本质上是有状态的活动。结果,人们非常迅速地想出了在无状态协议之上建立状态的方法。这些机制包括cookie之类的东西,如URL中的状态编码,以及让服务器根据这些内容动态地启动数据,如隐藏状态请求之类,.........直到一大堆东西为止,包括更现代的东西。 Web套接字之类的东西。
您可以通过以下链接来更深入地了解这些概念: