关于Cookie的值
cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。
domain
domain表示的是cookie所在的域,默认为请求的地址
如网址为www.test.com/test/test.aspx,那么domain默认为www.test.com。
跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。
修改domain
1 | //域名home.example.com和example.com,相对来说就是跨域了 |
规则
设置cookie——设置cookie的时候,domain要符合域名的规则,比如可以设置成www1.pclady.com.cn和pclady.com.cn 但是不能设置成pclady。要有.com.cn或者其他域名做结尾。 通过js手动设置cookie的domain都是以.开头的。比如设置domain=pclady.com.cn,实际的domain名为.pclady.com.cn;删除cookie时加不加.都可以。
获取cookie——js只能获取domian大于等于当前页面域名的cookie。
删除cookie——要删除一个cookie,domain值必须跟要删除cookie的domain相同,默认的domain为html文件的domain。
跨域domain——js不可以把cookie设置成不同与html域名的domian。cookie设置不会成功,但不会影响后面程序对cookie的操作。
错误——如果domain设置错误,该cookie将不会被创建,并且后续对cookie的操作不论正确与否都会被浏览器禁止。
path
path表示cookie所在的目录,test.com默认为/,就是根目录。
在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/1/,那么test下的所有页面都可以访问到cookie1,而/test/和/test/2/的子页面不能访问cookie2。这是因为cookie能让其path路径下的页面访问。
规则:
- 设置cookie——js设置path要以”/“开头,比如html路径为”/zt/20160623/“,路径可以设置成”/“或”/zt”。
- 获取cookie——使用js只能获取path大于等于当前页面path的cookie,比如html路径为/zt/20160623/,使用js只能获取“/zt/20160623/”和“/zt”和“/”路径下的cookie。不能获取其他路径下的cookie
- 删除cookie——删除cookie的时候路径也必须相同,默认的路径是html的path路径。
- 错误——如果path不是以”/“开头的则创建cookie的path使用默认的path;如果是以”/“开头但是设置错了,路径名不存在或者直接设置成子路径。比如设置成”/20160623”或者”/zt1”,该cookie将不会被创建,并且后续对cookie的操作不论正确与否都会被浏览器禁止。
注意:
浏览器会将domain和path都相同的cookie保存在一个文件里,cookie间用*隔开。
含值键值对的cookie
以前一直用的是nam=value单键值对的cookie,一说到含多个子键值对的就蒙了。现在总算弄清楚了。含多个子键值对的cookie格式是name=key1=value1&key2=value2。可以理解为单键值对的值保存一个自定义的多键值字符串,其中的键值对分割符为&,当然可以自定义一个分隔符,但用asp.net获取时是以&为分割符。
expires
cookie过期时间
操作Cookie
存cookie
1 | document.cookie = 'username=Darren' |
读cookie
1 | function getCookie(c_name){ |
设置cookie有效期
1 | document.cookie = "name=value;expires=date" |
上面代码中的date值为GMT(格林威治时间)格式的日期型字符串,生成方式如下:
1 | var _date = new Date(); |
设置cookie路径
1 | document.cookie = "name=value;path=path" |
默认在根目录下, 即 path=/
设置cookie的域
1 | document.cookie = "name=value;path=path;domain=domain" |
注:一定的是同域之间的访问,不能把domain的值设置成非主域的域名。
总结
页面能访问哪些cookie跟从哪里引入js没有半毛钱关系。而跟html页面本身的domain和path有很直接的关系
第一方cookie和第三方cookie
第一方cookie: 访客在访问当前页面时给浏览器设置的cookie, 这个cookie一般是设在当前域名下, 也可用上面描述的方法设置到顶级域名下.
第三方cookie: 当前访问的网页加载第三方的代码, 那么第三方也会添加cookie, 这就是第三方cookie. 简单来说,就是用户当前浏览的页面上有通过IFRAME、IMG或script等标签嵌入另外一个域名的链接地址,该链接设置的cookie就称为第三方cookie,当前页面设置的cookie为第一方cookie。
由于隐私保护的问题,现在主流的浏览器默认是不允许写入第三方cookie的,但是只要在相应的Header信息设置了P3P,第三方cookie还是能正常的写入的。
例如在php中通过下面的代码就能正确的写入一个名为thirdcookie的cookie。
1 | header(‘P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘); |
需要注意的是即使设置了P3P,只有通过服务器端的操作才能写入cookie,客户端方用javascript的方法也依然无法写入cookie,而且在IE6下javascript也无法读取到第三方cookie。
第三方Cookie,那么无论多少个域,都只有一个Cookie,一个属于第三方域的Cookie,网站下所有域都能共享这个Cookie,那么所有的行为都能被关联起来分析。但是第三方Cookie的接受率不如第一方Cookie(不过主流的浏览器默认的设置下也接受带P3P协议的第三方Cookie,我的经验是接受率能达到90%,甚至95%以上)