前端入门:重学Cookie与Session

之前写过一个个人门户网站,在登录这块,其中涉及到了Cookie和Session的相关知识,忽然发现,虽然自己经常使用Cookie和Session,但对两者的原理和联系却知之甚少,所以写了一篇博客来记录一下 。今天主要从以下三个方面来阐述这两者的原理和联系:

  • 产生背景
  • 运行机制
  • 使用时需要注意的相关问题
Cookie一、Cookie的产生背景
在web应用中,会话跟踪是很重要的 。一个用户的所有请求操作都应该属于同一个会话 。 例如,在网上商城中,用户A购买的商品都应该放在A的购物车内,而不能放在用户B或C的购物车内,因为它们不属于同一个会话 。
众所周知,web应用是使用HTTP协议传输数据的,而HTTP协议是无状态的 。这里稍微解释一下HTTP协议的无状态特性:浏览器的每一次请求,服务器都会独立处理,不与之前或之后的请求产生关联,也就是说,浏览器的每一次请求,对服务器来说都是全新的 。这个过程可以用下图说明:
前端入门:重学Cookie与Session

文章插图
 
一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话 。 即用户A购买了一件商品放入购物车内,当再次购买商品时,服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了 。要跟踪该会话,必须引入一种机制,于是Cookie就应运而生了 。Cookie由W3C组织提出,最早由Netscape社区发展,目前所有的主流浏览器都支持Cookie 。Cookie的工作原理
上面说到由于HTTP协议的无状态特性,服务器无法从连接上知道客户身份 。解决办法就是给客户端颁发一个“通行证”,无论谁访问都必须携带自己的通行证,这样服务器就能从通行证上确认客户身份了,这就是Cookie的工作原理 。
Cookie实际上是一小段文本信息 。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,在Servlet中即调用response.addCookie(Cookie cookie)方法 。客户端浏览器会把Cookie保存起来,当浏览器再次请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,从而获得用户身份信息 。服务器还可以根据需要修改Cookie的内容 。
二、Cookie的机制
Cookie机制采用的是在客户端保持状态的方案 。 当服务器调用addCookie方法向浏览器颁发Cookie,本质上是在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的Cookie,保存在客户端,里面记录着用户当前的信息 。当用户再次访问服务器时,浏览器检查所有存储的Cookie,如果某个Cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该Cookie附在请求资源的HTTP请求头上发送给服务器,服务器根据该Cookie获得用户身份信息 。
前端入门:重学Cookie与Session

文章插图
 
三、Cookie相关问题
1、Cookie的生命周期
在讨论Cookie的生命周期之前,先说一下setMaxAge(int maxAge)方法,该方法用于设置Cookie的失效时间 。
如果maxAge为正数,则表示该Cookie会在maxAge秒之后自动失效 。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中 。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效 。
如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效 。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中 。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了 。Cookie默认的maxAge值为–1 。
2、Cookie的修改和删除
Cookie并不提供修改、删除操作 。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie即可 。
如果要删除某个Cookie,可以将Cookie的maxAge属性设置为0;也可以新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie 。maxAge为0的Cookie即失效Cookie,会被浏览器从Cookie文件或者内存中删除 。
注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样 。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败 。
3、Cookie的不可跨域名性
很多网站都会使用Cookie,例如,google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie 。但是浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie;Google也只能操作Google的Cookie,而不能操作Baidu的Cookie 。这是由Cookie的隐私安全机制决定的,隐私安全机制能够禁止网站非法获取其他网站的Cookie,即Cookie的不可跨域名性 。


推荐阅读