Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
Cookie机制
理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的请求操作则应该属于另一个会话。而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议,一旦数据交换完毕,客户端与服务器的连接就会关闭,再次交换数据需要建立新的连接。这意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买时服务器已经无法判断该购买的行为属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
Cookie就是这样一种机制,可以弥补HTTP协议的不足。在Session出现之前,基本上多有的网站都采用Cookie来跟踪会话。
由于HTTP是一种无状态的协议,服务器单从网络连接上无法知道客户的身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己的通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户请求服务器,如果服务器需要记录该用户状态,就使用response向客户端颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
Cookie具有不可跨域名性。Cookie在客户端由浏览器来管理,浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。
中文与英文字符不同,中文属于Unicode字符,在内存中占4个字节,英文属于ASCII字符,内存中占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。Cookie中保存中文只能编码。一般使用UTF-8编码即可。
客户端读取Cookie时,包括maxAge在内的属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。
修改、删除Cookie时,新建的Cookie除value,maxAge之外的所有属性,如name、path、domain等都要与原Cookie完全一样。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该浏览器中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访问的时候只需要查询客户档案就可以了。
每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器的时候创建的。
Session的正常运行需要客户端浏览器的支持。这是因为Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的cookie,它的值为该Session的id。Session依据该Cookie来识别是否为同一用户。
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取的Session的id。