Cookie
- HTTP Cookie,通常直接叫做cookie,最初是在客户端存储会话信息的。该标准要求服务器对任意HTTP请求发送Set-Cookie HTTP头作为响应的一部分,其中包含会话信息
- 发送回服务器的额外信息可以用于唯一验证客户来自于发送的哪个请求
限制:
- cookie在性质上是绑定在特定域名下的。当设定了一个cookie后,再给创建它的域名发送请求时,都包含这个cookie。这个限制确保了存储再cookie中的信息只能让批准的访问者访问,而无法被其他域访问
- 由于cookie是存储再客户端计算机的,还加入了一些限制确保cookie不会被恶意使用,同时不会占用太多磁盘空间。每个域cookie的总数是有限的,不同浏览器之间有所不同
IE6以及更低版本限制每个域名最多20个cookie
IE7和之后版本每个域名最多50个。IE7最初是支持每个域名最大20个cookie,之后被微软的一个补丁所更新
Firefox限制每个域最多50个cookie
Opera限制每个域最多50个cookie
Safari和Chrome对于每个域的cookie数量限制没有硬性规定 - 当超过单个域名限制之后还要再设置cookie,浏览器就会清除以前设置的cookie。IE和Opere会删除最近使用过的cookie,腾出空间给新设置的cookie。Firefox看上去好像是随机决定要清除哪个cookie。
- 浏览器对cookie的尺寸也有限制。大多数浏览器都大约4096B(加减1)的长度限制。为了最佳的浏览器兼容性,最好将整个cookie长度限制再4095B(含4095)以内,尺寸影响到一个域下的所有cookie,并非每个cookie单独限制
- 如果尝试创建超过最大尺寸限制的cookie,那么该cookie会被悄无声息地丢掉。注意,虽然一个字符通常占用一字节,但是多字节的情况则有不同
cookie构成
- 名称:一个唯一确定cookie的名称,cookie名称是不区分大小写的,所以myCookie和MyCookie被认为同一个cookie。然而,实践中最好将cookie的名称看作是区分大小写的,因为某些服务器会这样处理cookie。cookie的名称必须是经过RUL编码的
- 值:存储在cookie中的字符串值。值必须被URL编码
- 域:cookie对哪个域是有效的。所有向该域发送的请求中都会包含这个cookie喜喜。这个值可以包含子域,也可以不包含它。如果没有明确设定,那么这个域会被认作来自设置cookie的那个域
- 路径:对于指定域中的那个路径,应该向服务器发送cookie
- 失效时间:表示cookie何时被删除的时间戳。默认情况下,浏览器会话结束时即将所有cookie删除;不过也可以自己设置删除时间。这个值时GMT格式的日期,用于指定应该删除cookie的准确时间。因此,cookie可在浏览器关闭后依然保持在用户的机器上。如果你设置的失效日期是个以前的时间,则cookie会被立即删除
- 安全标志:指定后,cookie只有在使用SSL连接的时候才会发送到服务器
Set-Cookie
每段信息都作为Set-Cookie头的一部分,是使用分号加空格每一段
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value; expires=Mon, 22-Jan-07 09:01:01 GMT; domain=.domain.com; path=/; secure
Other-header: other-header-value
- 该头信息指定了一个叫做name的cookie,它会在格林时间2007年1月22日9:01:01失效,通知对于www.domain.com和domain.com的任何子域都有效
- secure标志是cookie中唯一一个非名值对的部分,只包含一个secure
- 域、路径、失效时间和secure标志都是服务器给浏览器的指示,以指定何时应该发送cookie。这些参数不会作为发送到服务器cookie信息的一部分,只有名值对才会被发送
JavaScript中的cookie
- DOM的document.cookie属性会因为使用它的方式不同而表现出不同的行为。当用来获取属性值时,document.cookie返回当前可用的(根据cookie的域、路径、失效时间和安全设置)所有cookie的字符串,一系列由分号隔开的名值对
- 所有名字和值都是经过URL编码的,所以必须使用decodeURIComponent( )来解码
- 当设置值的时候,document.cookie属性可以设置为一个新的cookie字符串。这个字符串会被解释并添加到cookie集合中。设置document.cookie并不会覆盖cookie,除非设置的cookie的名称已经存在。设置cookie的格式如下,和Set-Cookie中使用的格式一样。
name=value; expriration_time; path=domain_path; doman=domian_name; secure
这些参数中,只有cookie的名字和值是必须的,如:
document.cookie = "name=test"
此代码创建了一个叫name的cookie,值为test。当客户端每次向服务器发送请求的时候,都会发送这个cookie;当浏览器关闭的时候,它就被删除。为了避免特殊字符导致bug,最好在每次设置的时候使用encodeURIComponent( )
document.cookie = encodeURIComponent("name") + "=" + encodeURIComponent("test");
如果想要给创建的cookie添加额外的信息,只需要将参数追加在此字符串后面即可,格式如Set-Cookie一样: