2.4 会话和Cookies
Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。用户每次访问站点时,Web应用程序都可以读取Cookie包含的信息。Cookie的基本工作原理:如果用户再次访问站点上的页面,当该用户输入URL地址时,浏览器就会在本地硬盘上查找与该URL相关联的Cookie。如果该Cookie存在,浏览器就将它与页面请求一起发送到用户请求的站点。Cookie根本的用途是:Cookie能够帮助Web站点保存有关访问者的信息。更简单地说,Cookie是一种保持Web应用程序连续性(执行“状态管理”)的方法。
什么是会话(Session)?当用户访问站点时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束。
2.4.1 静态网页和动态网页
静态网页的网址形式通常是以.htm、.html、.shtml、.xml等为后缀的。静态网页一般来说是最简单的HTML网页,服务器端和客户端是一样的,而且没有脚本和小程序,所以它不能动。在HTML格式的网页上,也可以出现各种动态的效果,如.gif格式的动画、FLASH、滚动字母等,这些“动态效果”只是视觉上的,与后面将要介绍的动态网页是不同的概念。
静态网页有以下特点:
(1)静态网页每个网页都有一个固定的URL,且网页URL以.htm、.html、.shtml等常见形式为后缀,而不含有“?”。
(2)网页内容一经发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都是保存在网站服务器上的,也就是说,静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件。
(3)静态网页的内容相对稳定,因此容易被搜索引擎检索。
(4)静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时,完全依靠静态网页制作方式比较困难。
(5)静态网页的交互性较差,在功能方面有较大的限制。
动态网页是以.asp、.jsp、.php、.perl、.cgi等形式为后缀的,并且在动态网页网址中有一个标志性的符号“?”。动态网页与网页上的各种动画、滚动字幕等视觉上的“动态效果”没有直接关系,动态网页可以是纯文字内容,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,采用动态网页技术生成的网页都称为动态网页。动态网页也可以采用静动结合的原则,适合采用动态网页的地方采用动态网页,如果需要使用静态网页,就可以考虑用静态网页的方法来实现,在同一个网站上,动态网页内容和静态网页内容同时存在是很常见的事情。
动态网页具有以下特点:
(1)交互性,即网页会根据用户的要求和选择而动态改变和响应。例如,访问者在网页上填写表单信息并提交,服务器经过处理将信息自动存储到后台数据库中,并打开相应提示页面。
(2)自动更新,即无须手动操作,便会自动生成新的页面,可以大大节省工作量。例如,在论坛中发布信息,后台服务器将自动生成新的网页。
(3)随机性,即当不同的时间、不同的人访问同一网址时会产生不同的页面效果。例如,登录界面自动循环功能。
(4)动态网页中的“?”对搜索引擎检索存在一定的问题,搜索引擎一般不可能从一个网站的数据库中访问全部网页,或者出于技术方面的考虑,搜索蜘蛛不会去抓取网址中“?”后面的内容,因此采用动态网页的网站在进行搜索引擎推广时,需要做一定的技术处理才能适应搜索引擎的要求。
静态网页和动态网页各有特点,网站采用动态网页还是静态网页主要取决于网站的功能需求和网站内容的多少,如果网站功能比较简单,内容更新量不是很大,采用纯静态网页的方式会更简单,如果网站功能复杂,那么最好采用动态网页技术来实现。
2.4.2 无状态HTTP
HTTP(Hyper Text Transport Protocol,超文本传输协议)是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,它就必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时,它的应答就较快。
客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,另一个则是Session。
Cookie是通过客户端保持状态的解决方案。从定义上来说,Cookie就是由服务器发给客户端的特殊信息,这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。讲得更具体一些:当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体中的,而是存放于HTTP响应头中的;当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置。对于Windows操作系统而言,我们可以从:
[系统盘]:\Documents and Settings\[用户名]\Cookies
目录中找到存储的Cookie。自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。而这次,Cookie信息则存放在HTTP请求头中。
有了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,从而再次使用。正是这样一个过程,用户的状态就得以保持了。
综上所述,HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们需要通过不同的技术为交互存储状态,而这些技术就是Cookie和Session。
2.4.3 常见误区
在学习、理解无状态HTTP时要避免以下常见误区:
(1)有人在解释HTTP的无状态时,把它跟有连接对立,说是两种方式,也就是如果想不无状态,就必须有连接,但其实不然。
(2)有连接和无连接以及之后的Keep-Alive都是指TCP连接。
(3)有状态和无状态可以指TCP,也可以指HTTP。
(4)TCP一直有状态,HTTP一直无状态,但是应用为了有状态,就给HTTP加了Cookie和Session机制,让使用HTTP的应用也能有状态,但HTTP还是无状态。
(5)开始TCP有连接,后来TCP无连接,再后来也就是现在的TCP是Keep-Alive,有点像有连接。