当前位置: 首页 > 面试题库 >

他们说http是无状态的是什么意思

宦琪
2023-03-14
问题内容

我正在研究Java for Web,它提到http是无状态的。这是什么意思,以及它如何影响编程

我也在研究spring框架,它提到了一些Bean,因为它们的状态发生了变化,它们必须声明为内部Bean。那是什么意思


问题答案:

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

(嗯,无论如何,对于高达1.0的HTTP都是如此。HTTP1.1添加了各种持久连接机制,因为真正的无状态协议会带来不可避免的性能问题。我们暂时将其忽略,因为它们并没有真正使HTTP成为有状态的,它们只是使它变为无状态的脏状态,而不是纯粹的无状态的代码。)

为了帮助您了解两者之间的区别,请设想Telnet或SSH等协议是无状态的。如果要获取远程文件的目录列表,则必须执行一次原子操作,即连接,登录,更改目录并发ls命令。当ls命令完成显示目录内容后,连接将关闭。然后,如果您想显示特定文件的内容,则必须再次连接,登录并切换到目录,然后发出cat命令。当显示文件的命令完成时,连接将再次关闭。

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

但…

除了查看静态网页之外,几乎您要执行的其他任何操作都将涉及会话和状态。当HTTP用于其原始目的(共享静态信息,如科学论文)时,无状态协议很有用。当您开始将它用于Web应用程序,在线商店等时,无状态便开始变得麻烦,因为它们本质上是有状态的活动。结果,人们非常迅速地想出了在无状态协议之上建立状态的方法。这些机制包括cookie之类的东西,如URL中的状态编码,以及让服务器根据这些内容动态地启动数据,如隐藏状态请求之类,.........直到一大堆东西为止,包括更现代的东西。
Web套接字之类的东西。

您可以通过以下链接来更深入地了解这些概念:

  • http://en.wikipedia.org/wiki/Stateless_server
  • http://en.wikipedia.org/wiki/HTTP
  • http://en.wikipedia.org/wiki/HTTP_persistent_connection


 类似资料:
  • HTTP有HTTP cookie。Cookie允许服务器跟踪用户状态、连接数、上次连接等。 HTTP具有持久连接(Keep-Alive),其中可以从同一个TCP连接发送多个请求。

  • 问题内容: 当JavaScript网络调用(例如fetch或XMLHttpRequest或任何其他类型的HTTP网络请求)失败且HTTP状态代码为0时,这是什么意思? 这似乎不是有效的HTTP状态代码,因为其他代码是HTTP规范中的三位数字。 我尝试将网络完全拔掉作为测试。它可能不相关,但是导致状态代码17003(IIRC),粗略搜索表明这意味着“ DNS服务器查找失败”。 相同的代码在某些位置和

  • 我对JAXB非常陌生,我对JAXB的默认行为感到困惑,我所理解的是: 如果可能的话,JAXB尝试通过自动检测相关类来创建JAXBContext。例如,JAXB可以读取与预期不完全匹配的XML文档。这是JAXB解组器的默认行为。例如,如果我们有一个Foo类: Foo类是以下文档的代表性Java类: 然后,如果我们有以下文档的XML实例,其中元素的内容由Foo类表示。 我们可以将其解组到一个Foo类中

  • 我刚刚完成了对log4j2.xml配置文件的调整,发现了一些我不太理解的东西。那么是什么? 几乎在以下所有示例中:http://logging.Apache.org/log4j/2.x/manual/configuration.html中,来自Apache的人员将状态添加到配置中。

  • 问题内容: 目前,我正在阅读“ Java并发实践”,其中包含以下句子: 由于线程访问无状态对象的操作不会影响其他线程上操作的正确性,因此无状态对象是线程安全的。 那么,什么是无状态对象? 问题答案: 无状态对象是没有实例字段(实例变量)的类的实例。该类 可能 具有字段,但是它们是编译时常量(静态final)。 一个非常相关的术语是 不可变的 。不可变的对象可能具有状态,但是在调用方法时状态不会改变

  • 问题内容: 该文档提到 您可以使用过滤器来找到状态为137的退出容器,这意味着SIGKILL(9)杀死了它们 我想知道退出状态255意味着有什么特别的吗? 问题答案: 如果您在docker ps上看到此状态,显示状态为“ ” 的容器,则表示其主要入口点/命令进程已停止并显示该状态。 255只是意味着“有一个错误”,但除此之外并没有告诉您太多信息。