cookie非常重要,它们定义了一些新的http首部,cookie的存在也影响了内存。
1.cookie的类型
可以将cookie分成两类:会话cookie和持久cookie。
会话cookie:是一种临时cookie,用户退出浏览器时,会话cookie就会被删除。
持久cookie:存储在硬盘上,浏览器退出,计算机重启时仍存在,通常会用持久cookie维护某个用户会周期性访问的站点配置文件或登录名。
二者唯一的区别是过期时间,如果设置了discard参数,或没有设置expires或max-age参数来说明扩展的过期时间,这个cookie就是一个会话cookie。
2 cookie如何工作
cookie中包含一个由名字=值这样的信息构成的任意列表,并由set-cookie首部将其贴到用户身上去。cookie可以包含任意信息,但通常只包含一个服务器为了进行跟踪而产生的独特的识别码(id=453545),但cookie并不限于id,很多web服务器会将信息直接保存在cookie中。将来用户访问统一站点时,浏览器会挑中那个服务器贴到用户上的cookie,并在cookie请求头部将其返回。
3. cookie罐:客户端的状态
网景navigator的cookie:存储在cookies.txt文本文件中。有七个tab分割的字段:domain, allh, path, secure, expiration, name, value
微软:存储在高速缓存目录下独立的文本文件中。
4 不同站点使用不同的cookie
cookie的域属性:domain。子域也可以被发布出去。
cookie的路径属性:cookie规范允许用户与部分web站点关联起来。可以通过path属性来实现这一功能。在这个属性列出的url路径前缀下所有的cookie都有效。
5 cookie成分
版本0的set-cookie属性
- name=value: 强制的,name和value都是字符序列,除非包含在双引号内,否则不包括分号,逗号,等号和空格。web服务器可以创建任意的name=value关联,在后继对站点的访问中会将其送回给web服务器。
- expires: 可选,该属性会指定日期字符,用来定义cookie实际生存期。唯一合法的时区为gmt。
- domain :可选,浏览器只向指定域的服务器主机名发送cookie,这样服务器就将cookie限定在特定的域中。只有指定域中的主机才能为一个域设置cookie,这些域中至少有两个或三个句号,以防止出现.com, .edu等形式的域,这里列出了一组固定的特定高层域。若没有指定域,就默认产生set-cookie响应的服务器的主机名。
- path: 通过这个属性可以为服务器上特定的文档分配cookie
- secure:如果包含这一属性,就只有在ssl连接时才会发送cookie。
版本1set-cookie2首部
- version: 规范的版本,强制
- comment:说明了服务器准备如何使用这个cookie。用户可以通过检查此策略来确定是否允许使用带有这个cookie的会话。这个值必须采用utf-8编码。
- commonURL:可选,提供url指针
- discard:可选,在客户端终止时,指示客户端放弃这个cookie。
- domain:与之前介绍的基本一样。
- max-age:用于设置秒单位的生存期。
- path:上同;如果没有指定路径,就将其设置为生成set-cookie响应的url路径。
- port:可选,表示可以应用的cookie端口列表。
- secure:上同。
6 cookie与缓存
下面是处理缓存时的指导性规则
1.如果无法缓存文档,要将其表示出来。具体来说,如果除了set-cookie首部之外文档是可缓存的,就使用cache-control:no-cache=”set-cookie”.另一种更通用的做法是为可缓存的文档使用cache-control:public,这样有助于节省带宽。
2. 缓存set-cookie首部要小心,如果响应中有set-cookie首部,就可以对主体进行缓存,但要特别注意对set-cookie首部的缓存。如果向多个用户发送了相同的set-cookie首部,可能会破坏用户的定位。
3. 有些缓存在响应缓存起来之前会删除set-cookie首部。原始服务器可以通过向缓存副本中添加这个首部来要求进行这种再验证。(??)
Cache-Control:must-revalidate, max-age=0
4.小心处理带有cookie首部的请求
得到广泛接受的策略是缓存带有cookie首部的照片,将过期时间设为0,强制每次都进行验证。