我正在研究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命令。当显示文件的命令完成时,连接将再次关闭。
当你以这种方式查看时,虽然Telnet / SSH听起来很愚蠢,不是吗?好吧,在某些方面它是事实,在某些方面不是。当协议为无状态时,服务器可以进行一些非常好的优化,并且数据可以轻松地散布。使用无状态协议的服务器可以非常有效地扩展,因此尽管实际的单个数据传输可能非常慢(打开和关闭TCP连接并不便宜!),但是整个系统可以非常非常高效,并且可以扩展到任意数量的用户。
但…
除了查看静态网页之外,几乎你要执行的其他任何操作都将涉及会话和状态。当HTTP用于其原始目的(共享静态信息,如科学论文)时,无状态协议很有用。当你开始将它用于Web应用程序,在线商店等时,无状态便开始变得麻烦,因为它们本质上是有状态的活动。结果,人们非常迅速地想出了在无状态协议之上消除状态的方法。这些机制包括cookie之类的东西,如URL中的状态编码,以及让服务器根据这些内容动态地激发数据,如隐藏状态请求之类,…好吧,诸如此类,包括最新的事物。 Web套接字之类的东西。