浅谈HTTP的无状态性

   HTTP是Hyper Text Transfer Protocol的缩写,顾名思义,这个协议支持着超文本的传输。那么什么是超文本呢?说白了就是使用HTML编写的页面。一般,咱们使用客户端浏览器访问服务器的资源,最多见的URL也是以html为后缀的文件。所以,咱们能够说超文本是网络上最主要的资源。

        既然HTTP协议的目的在于支持超文本的传输,更加广义一些就是支持资源的传输,那么在客户端浏览器向HTTP服务器发送请求,继而HTTP服务器将相应的资源发回给客户端这样一个过程当中,不管对于客户端仍是服务器,都没有必要记录这个过程,由于每一次请求和响应都是相对独立的,就好像你在自动售货机前投下硬币购买商品同样,谁都不会也不须要记住这样一个交易过程。通常而言,一个URL对应着惟一的超文本,而HTTP服务器也绝对公平公正,无论你是 Michael,仍是Jordon,它都会根据接收到的URL请求返回相同的超文本。正是由于这样的惟一性,使得记录用户的行为状态变得毫无心义,因此,HTTP协议被设计为无状态的链接协议符合它自己的需求。
        然而,随着时间的推移,人们发现静态的HTML着实无聊而乏味,增长动态生成的内容才会令Web应用程序变得更加有用。因而乎,HTML的语法在不断膨胀,其中最重要的是增长了表单(Form);客户端也增长了诸如脚本处理、DOM处理等功能;对于服务器,则相应的出现了CGI(Common Gateway Interface)以处理包含表单提交在内的动态请求。在这种客户端与服务器进行动态交互的Web应用程序出现以后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是须要承前启后的,简单的购物车程序也要知道用户到底在以前选择了什么商品。因而,两种用于保持HTTP链接状态的技术就应运而生了,一个是Cookie,而另外一个则是Session。
        Cookie是经过客户端保持状态的解决方案。从定义上来讲,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,而后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。让咱们说得更具体一些:当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的我的信息而且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些我的信息,固然这些信息并非存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header);当客户端浏览器接收到来自服务器的响应以后,浏览器会将这些信息存放在一个统一的位置,对于Windows操做系统而言,咱们能够从: [系统盘]:\Documents and Settings\[用户名]\Cookies目录中找到存储的Cookie;自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。而此次,Cookie信息则存放在HTTP请求头(Request Header)了。         有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求以后,就可以经过分析存放于请求头的Cookie获得客户端特有的信息,从而动态生成与该客户端相对应的内容。一般,咱们能够从不少网站的登陆界面中看到“请记住我”这样的选项,若是你勾选了它以后再登陆,那么在下一次访问该网站的时候就不须要进行重复而繁琐的登陆动做了,而这个功能就是经过Cookie实现的。             与Cookie相对的一个解决方案是Session,它是经过服务器来保持状态的。因为Session这个词汇包含的语义不少,所以须要在这里明确一下 Session的含义。首先,咱们一般都会把Session翻译成会话,所以咱们能够把客户端浏览器与服务器之间一系列交互的动做称为一个 Session。从这个语义出发,咱们会提到Session持续的时间,会提到在Session过程当中进行了什么操做等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。从这个语义出发,咱们则会提到往Session中存放什么内容,如何根据键值从 Session中获取匹配的内容等。         要使用Session,第一步固然是建立Session了。那么Session在什么时候建立呢?固然仍是在服务器端程序运行的过程当中建立的,不一样语言实现的应用程序有不一样建立Session的方法,而在Java中是经过调用HttpServletRequest的getSession方法(使用true做为参数)建立的。在建立了Session的同时,服务器会为该Session生成惟一的Session id,而这个Session id在随后的请求中会被用来从新得到已经建立的Session;在Session被建立以后,就能够调用Session相关的方法往Session中增长内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求以后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。有关Session的内容还比较多,在之后的Post中,我还将继续讲述。         综上所述,HTTP自己是一个无状态的链接协议,为了支持客户端与服务器之间的交互,咱们就须要经过不一样的技术为交互存储状态,而这些不一样的技术就是Cookie和Session了。
相关文章
相关标签/搜索