在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要。
 
什么是Cookie
所谓Cookie,只是一条极为短小的信息,它被浏览器自动地放置在访问用户的电脑硬盘中。
例如:C:\Users\[user]\AppData\Roaming\Microsoft\Windows\Cookies 
 

 
 如上图所示,打开的一个文件里面,标示了一个域下多个Cookie的信息。
 
 
检测/判断浏览器是否支持Cookie
在绝大多数浏览器中,可以通过检测 navigator.cookieEnabled这个属性来实现,若该值为true,则当前Cookie功能是开启的。
 
Cookie属性
Cookie比较重要的几个属性
Cookie名(name),Cookie值(value),存储域(domain),存储路径(path),Cookie有效期(max-age/expires),secure属性(一般不常用)
 
Cookie值(value) 最好经过encodeURIComponent编码,否则可能会出现不同浏览器处理不同的异常或者直接报错。
 
注:HttpOnly属性其他语言(Java)设置的Cookie的一个属性,设置该属性的Cookie,js是无法读取的。
max-age:设置在多久后过期;
expires:设置一个过期的时间点;
 
上述属性中默认字段
 
 
 
js写Cookie 
document.cookie='cookie_name=cookie_value;path=/;domain='+'.site.cn;max-age=Session;'  //一般写法,此处的.site.cn需要换成你js执行的网页的域名
写Cookie方法 

function setCookie(name,value,domain,path,day){
var cookie =name+'='+encodeURIComponent(value);  //设置Cookie的名称和Cookie的值,Cookie名称为必填项。

if(typeof day === 'number'){
     cookie+=';max-age='+(day*60*60*24);  //设置Cookie的过期事件,默认为Session
     }
if(!path){cookie+=';path=/'}  //设置Cookie的路径,默认为 /
if(domain){cookie+=';domain='+domain}  //设置Cookie的存储域,默认为当前js执行的网页的域
document.cookie= cookie;
}
 
什么是一条Cookie
Cookie在浏览器中的(使用F12查看Cookie)Cookies中就能看到所有的Cookie。
但是请注意,Cookies和Cookie是有区别的,Cookies是代表多个独立唯一的Cookie的集合。
Cookie指的是,唯一独立的一条Cookie的信息。我们修改、删除该Cookie是不会对其他Cookie产生任何影响。
 
唯一的Cookie指的是,在Cookie名称、Cookie存储域,Cookie存储路径,这三个属性中,任意一个属性不同,就标示一个独立的Cookie,都是唯一的Cookie。

 
 
 
什么是第一方Cookie,第三方Cookie
所谓第一方Cookie,和第三方Cookie,这是一个相对定义。
第一方Cookie:存储在(domain值为),当前域 或 当前子域 或 当前父域下的Cookie,统称为第一方Cookie;
第三方Cookie:存储在(domain值为),不是当前域 且 不是当前域的子域 且 不是当前父域下的Cookie,统称为第一方Cookie;
 
例如:我在新浪首页,看Cookie的时候,发现了其他非新浪域名下的Cookie,如京东的Cookie,那么此时 第一方Cookie是存储域名是新浪下面的 (.sina.com.cn,www.sina.com.cn以及sina.com.cn的子域)域,第三方Cookie是存储域名为(.jd.com , .taobao.com等)非新浪域名以及子域的Cookie的统称。
 
例如:我在京东首页,看Cookie的时候,发现了其他非京东域名下的Cookie,如新浪的Cookie,那么此时 第一方Cookie是存储域名是新浪下面的 (.jd.com,www.jd.com以及jd.com的子域)域,第三方Cookie是存储域名为(.baidu.com , .google.com等非)京东域名以及子域的Cookie的统称。
 
 
js读Cookie
读Cookie方法
function getCookie(name){
var arr,reg=new RegExp("(^| )*"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg)){
     return unescape(arr[2]);
     }else{return null}
}
 
 
 
 
js读取同名Cookie的顺序问题
从上面对唯一Cookie的描述中中可以看出,名称相同也可能时不同的Cookie,那就有了读js读取同名Cookie的问题,在读取同名Cookie的顺序不是个可控的。
例如:写入4个Cookie,(虽然如下四个Cookie名相同,但是他们存储的domain不同,所以都可以存在)

document.cookie='cookie_name=cookie_value5;path=/;'+'max-age=Session;'
document.cookie='cookie_name=cookie_value4;path=/;domain='+'www.site.net;max-age=Session;'
document.cookie='cookie_name=cookie_value3;path=/;domain='+'.site.net;max-age=Session;'
document.cookie='cookie_name=cookie_value2;path=/xxxx;domain='+'.site.net;max-age=222222;'

执行读Cookie的方法时,getCookie('cookie_name'),是把document.cookie中出现的第一个,Cookie名称为cookie_name的值读取出来(如果全部执行上述代码,getCookie('cookie_name')的返回值为cookie_value5)。

在执行document.cookie(写Cookie)时,是一个累加的过程。

document.cookie = 原来的Cookie(document.cookie)+ 现在需要写入的Cookie;

注:如果在写一个,同路径(path相同),且同域(domain值相同),Cookie名称相同(如Cookie名称为 C1),(除了Cookie值和存储时长外)全部相同的,浏览器处理逻辑为。

1)删除原来的Cookie(名称为相同Cookie名称的C1的Cookie);

2)执行document.cookie = 原来的Cookie(document.cookie)+ 现在需要写入的Cookie(名称为C1的Cookie);

JS删除Cookie的原理

正是因为Cookie处理逻辑(在执行document.cookie(写Cookie),是一个累加的过程,见上面描述),所以js才可以实现对未过期的Cookie进行删除操作。

删除Cookie有两种办法:

1,把它的值设置为空;

  写一个同名(name值相同),同域(domain值相同),同路径(path值相同),同时长/不同时长(max-age/expires值相同/不同),但值为空(value为空)的Cookie;

2,把这个Cookie的过期时间设置为已经过去的一个时间点,例如,昨天,去年。

  写一个同名(name值相同),同域(domain值相同),同路径(path值相同),值为空/不为空(value为空/不为空)的Cookie,但时长为过去时间/值为下一毫秒就过期(max-age/expires的值为上一分钟,去年,昨天等值,或者为max-age=1毫秒等);

js读Cookie的一些问题

1、js无法读取Cookie的domain属性;
2、Cookie的Secure属性,如果设置了,则只有在HTTPS的协议下,才能传递值,HTTP协议下读不到该值。
3、在写Cookie时,如果设置了path路径不是/,而是固定的一个路径,那么只有在该路径下的页面中执行读取Cookie,才可以读取数据。
4、想要读取父域中Cookie的值,需要将这个Cookie的域写为(.site.com),如果写为(site.com)则只有http://site.com中才可以读取到值。http://www.site.com可以读取(.site.com)以及(www.site.com)、(.www.site.com)域中cookie的值。

注:Cookie存储在.site.com site.com中是两种概念,所有存储域是以 . (英文点) 开始的,标示是开放域,存储在这样域下的Cookie,是可以在当前域下的所有子域,孙域,都可以读取,非开放域(不是以英文点开始的存储域),只能在当前域中读取到。同级域无法共通(也就是在s1.site.com网页,无法读取到.www.site.com存储的Cookie)

js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总的更多相关文章

  1. JS的video获取时长,出现问题汇总

    <video id="my_video_1" controls="controls" style=" width: 700px; height: ...

  2. js 获取上传视频的时长、大小、后缀名

    参考资料:获取时长 var fileName = $("#sectionfileUpload").val(); //C:\fakepath\3.jpeg var exts = fi ...

  3. js估算一篇文章的阅读时长

    每天早上上班在地铁里我都有看技术类文章以及实时新闻的习惯,偶尔会看到有些文章的开始部分会提醒我们这篇文章大概的阅读时长,我就在想这是怎么实现的,具体到前端开发中,又是如何实现的.今天在浏览Segmen ...

  4. JS读写cookie以及中文乱码解决

    本文地址:http://www.cnblogs.com/PiaoMiaoGongZi/p/4092489.html 转载请注明. Js获取所有的cookie信息: var cookiename = d ...

  5. JS读写Cookie(设置、读取、删除)

    JS读写Cookie(设置.读取.删除) Cookie是客户端存放数据的一种方式,可用来做状态保持. 1.设置Cookie: a.无过期时间:(若不设置过期时间,默认为会话级Cookie,浏览器关闭就 ...

  6. JS读写浏览器cookie及读取页面参数

    JS读写浏览器cookie及读取页面参数 var zbrowser = { //设置浏览器cookie,exdays是cookie有效时间 setCookie: function (c_name, v ...

  7. 两种方法使用js读写cookie实现一个底部广告浮层效果

    下面一个案例实现了js实现一个页面浮层并且使用两种方法使用js读写cookie:来实现用户关闭广告的显示状态: 读者可以将下面代码复制到一个html文件试试效果:html的pre标签未两种js实现的方 ...

  8. 通过js来设置cookie和读取cookie,实现登陆时记住密码的功能

    function setCookie(){ //设置cookie var loginCode = $("#login_code").val(); //获取用户名信息 var pwd ...

  9. 深入了解浏览器存储:对比Cookie、LocalStorage、sessionStorage与IndexedDB

    摘要: 对比Cookie.LocalStorage.sessionStorage与IndexedDB 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 随着移动网络的发展与演化,我 ...

随机推荐

  1. pip 安装 MySQL-python 失败

    今天在安装 MySQL-python 提示 EnvironmentError: mysql_config not found 得知 mysql_config 是属于MySQL开发用的文件,而使用apt ...

  2. Android 工程师如何快速学会web前段

    Android 工程师如何快速学会web前段 今天主要聊一下本人最近在学习web前段的感受,最近html5是越来越火了,前段时间公司做了一个项目然后让我们“android”的程序猿过去帮忙把客户 端框 ...

  3. 关于struts2中的相对路径与绝对路径

    从昨天开始复习了struts2的课程,之所以重新走上java的道路,是觉得写了一年的go程序,并没有感觉到学习了什么,反而把java给忘得干干净净的.想想我的计划,年后就要换工作了,至于要换到什么方向 ...

  4. python之路-Day11

    引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程: ...

  5. OO.A.D.P

    OO/A/D/P 对象和类 三大特征 对象: 对象是面向对象语言的一个极为重要的特点,所有的面向对象语言都有对象的共性. 1. 职责(单一) 2. 属性(数据.可改变的) 3. 函数(行为.方法.业务 ...

  6. <textarea>没有内容时,按回车键,设置光标不换行

    $("textarea").val($("textarea").val().replace(/\n/g,""));

  7. eclipse查看class文件的源码

    eclipse查看class文件的源码: 1.网上下载jadClipse的jar包和执行文件jad.exe和 net.sf.jadclipse_3.3.0.jar. 2.把上面下载的jar包放在ecp ...

  8. php的进制转换

    学习了php的进制转换,有很多的知识点,逻辑,也有最原始的笔算,但是我们还是习惯使用代码来实现进制的转换,进制的转换代码有如下:二进制(bin)八进制( oct)十进制( dec)十六进制( hex) ...

  9. lua 代码风格

    参考  http://www.kancloud.cn/kancloud/lua_style_guide/66327 1.命名 1.命名法:小驼峰命名法,大驼峰命名法(Pascal命名法),小下划线命名 ...

  10. thinkphp 动态 级联

    <div class="form-item"> <label class="item-label">一级分类<span class ...