我正在研究java for web,它提到http是无状态的。 这是什么意思以及它如何影响编程
我也在研究spring框架,并且在那里提到一些bean必须声明为内部bean,因为它们的状态发生了变化。这意味着什么?
答案 0 :(得分:61)
HTTP--这是服务器和客户端之间的实际传输协议 - 是“无状态的”,因为它在调用之间不会记住任何内容。 通过HTTP访问的每个资源都是单个请求,它们之间没有线程连接。如果您加载一个包含HTML文件的网页,其中包含三个<img>
标记到同一服务器,则将协商和打开四个TCP连接,四个数据传输,四个连接关闭。服务器处于协议级别根本没有保留状态,这将使服务器在您进入时了解您的任何信息。
(嗯,无论如何,对于高达1.0的HTTP都是如此.HTTP 1.1增加了各种类型的持久连接机制,因为真正的无状态协议产生了不可避免的性能问题。我们暂时会忽略它,因为它们不会真的让HTTP变为有状态,它们只是使它变得无脏无状态而不是纯无状态。)
为了帮助您了解其中的差异,请假设Telnet或SSH等协议是无状态的。如果要获取远程文件的目录列表,则必须作为一个原子操作连接,登录,更改目录并发出ls
命令。当ls
命令完成显示目录内容时,连接将关闭。如果您希望显示特定文件的内容,则必须再次连接,登录,切换到目录,然后发出cat
命令。当显示文件的命令完成时,连接将再次关闭。
当你这样看时,虽然Telnet / SSH的镜头,听起来很愚蠢,不是吗?嗯,在某些方面它是,在某些方面它不是。当协议是无状态时,服务器可以做一些非常好的优化,并且数据可以很容易地传播。使用无状态协议的服务器可以非常有效地扩展,因此实际的单个数据传输速度非常慢(打开和关闭TCP连接并不便宜!)整个系统可以非常非常高效,并且可以扩展到任意数量的用户。 / p>
但是...
除了查看静态网页之外,您几乎要做的任何事情都涉及会话和状态。当HTTP用于其原始目的(共享静态信息,如科学论文)时,无状态协议很有意义。当您开始将它用于Web应用程序,在线商店等时,那么无国籍状态开始变得麻烦,因为这些本质上是有状态的活动。结果,人们非常迅速地想出了在无状态协议之上铺平国家的方法。这些机制包括诸如cookie之类的东西,比如URL中的编码状态,以及让服务器根据这些来动态启动数据,比如隐藏的状态请求,比如...好吧,像一大堆东西,包括更现代的Web Sockets之类的东西。
以下是您可以遵循的一些链接,以便更深入地了解这些概念:
答案 1 :(得分:12)
HTTP是无状态的 - 这意味着当使用HTTP时,端点不会“记住”事物(例如你是谁)。它没有国家。这与桌面应用程序形成对比 - 如果您有一个表单并且您转到另一个表单,然后返回,状态已被保留(只要您没有关闭该应用程序)。
通常,为了在Web应用程序中维护状态,可以使用cookie。
答案 2 :(得分:5)
无状态协议不要求服务器在多个请求期间保留有关每个用户的信息或状态。例如,当需要Web服务器为用户定制网页的内容时,Web应用程序可能必须跟踪用户在页面之间的进度。
常见的解决方案是使用HTTP cookie。其他方法包括服务器端会话,隐藏变量(当前页面是表单时)和使用URI编码参数进行URL重写,例如/index.php?session_id=some_unique_session_code。
答案 3 :(得分:4)
HTTP 称为无状态协议,因为每个命令都是独立执行的,不知道之前的命令。
HTTP的这一缺点正在许多新技术中得到解决,包括cookies。
答案 4 :(得分:3)
当说某些东西是无状态时,通常意味着你不能假设服务器跟踪交互之间的任何状态。
默认情况下,HTTP协议假设一个真正无状态的服务器。每个请求都被视为独立请求。
实际上,某些服务器(大多数)在fixed
中使用请求中的跟踪cookie来匹配服务器上的某个状态与特定客户端。这是有效的,因为cookie的工作方式(在客户端上设置后,它们会在每个后续请求中发布到服务器上。)
基本上,非无状态的服务器是规模的障碍。您需要确保将来自特定浏览器的所有请求路由到同一实例或进行状态的后端复制。在尝试扩展应用程序时,这通常是一个限制因素。
还有其他一些跟踪状态的解决方案(参见rails的加密状态cookie),但基本上如果你想增长,你需要想办法避免在服务器上跟踪状态:)。