当他们说http是无国籍时,这是什么意思

35 java spring state http

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

我也在研究spring框架,并在那里提到一些bean必须在状态发生变化时声明为内部bean.这意味着什么?

JUS*_*ION 62

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

(嗯,无论如何,对于高达1.0的HTTP都是如此.HTTP 1.1增加了各种类型的持久连接机制,因为真正的无状态协议产生了不可避免的性能问题.我们暂时忽略了这一点,因为它们实际上并不是真的使HTTP有状态,它们只是使它变为无状态而不是纯无状态.)

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

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

但...

除了查看静态网页之外,您几乎要做的任何事情都涉及会话和状态.当HTTP用于其原始目的(共享静态信息,如科学论文)时,无状态协议很有意义.当您开始将它用于Web应用程序,在线商店等时,那么无国籍状态开始变得麻烦,因为这些本质上是有状态的活动.结果,人们非常迅速地想出了在无状态协议之上铺平国家的方法.这些机制包括诸如cookie之类的东西,比如URL中的编码状态,以及让服务器根据这些来动态启动数据,比如隐藏的状态请求,比如...好吧,像一大堆东西,包括更现代的像Web套接字之类的东西.

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

  • 惯性?我无法真正读懂他们的想法.没有技术上的理由阻止它们支持有状态连接(假设人们非常容易在HTTP之上施加状态),而且确实是[Web Sockets]的全部要点(http://en.wikipedia.org/wiki/WebSockets )是通过HTTP提供类似TCP的连接(TCP是一种有状态的,面向连接的低级协议).对我个人而言,这是一个谜,但我不是协议设计师.也许有一些关于无状态协议的东西值得痛苦. (3认同)

Ode*_*ded 13

HTTP是无状态的 - 这意味着当使用HTTP时,端点不会"记住"事物(例如你是谁).它没有国家.这与桌面应用程序形成对比 - 如果您有一个表单并且您转到另一个表单,然后返回,状态已被保留(只要您没有关闭该应用程序).

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


Lui*_*uis 5

无状态协议不要求服务器在多个请求期间保留关于每个用户的信息或状态.例如,当需要Web服务器为用户定制网页的内容时,Web应用程序可能必须跟踪用户在页面之间的进度.

常见的解决方案是使用HTTP cookie.其他方法包括服务器端会话,隐藏变量(当前页面是表单时)和使用URI编码参数的URL重写,例如/index.php?session_id=some_unique_session_code.

这里