服务器端通过响应消息头在客户端设置cookie,如:
HTTP/1.1 200 OK Content-type:text/html Set-Cookie:name=value 浏览器存储cookie后,通过给每个请求添加Cookie HTTP 头消息,将cookie信息发送回服务器,如: GET /index.html HTTP/1.1 Cookie:name=value每个域名最多20个cookie(不同浏览器有所不同);
每个cookie最大4kB
name:必须,不区分大小写(myCookie和MyCookie是一个,名字重复就覆盖了),需要经过URL编码
value:必须,需要经过URL编码
domain:(可选) 域名,默认cookie所属网站的域名(所有向该域发送的请求中都会带cookie信息)
path:(可选) 指定域中的某个路径(向该路径下的请求发送cookie)
maxage:(可选)最大存活时间,默认会话结束cookie删除。可自己设置GMT格式的日期(Wdy,DD-Mon-YYYY HH:MM:SS GMT)
secure:(可选)指定后,cookie只有在使用SSL连接时才发送到服务器。https请求
唯一确定一个Cookie:domain+path+name
为了绕开浏览器的单域名下的cookie数限制,在cookie值中存放多个键值对,格式如下:
name=name1=value1&name2=value2&name3=value3subcookie使用解析对象: var SubCookieUtil = { get:function(name,subName){ var subCookies = this.getAll(name); if(subCookies){ return subCookies[subName]; }else{ return null; } }, getAll:function(name){ var cookieName = encodeURIComponent(name)+"=", cookieStart = document.cookie.indexOf(cookieName), cookieValue = null, cookieEnd, subCookies, i, parts, result={}; if(cookieStart > -1){ cookieEnd = document.cookie.indexOf(";",cookieStart); if(cookieEnd == -1){ cookieEnd = document.cookie.length; } cookieValue = document.cookie.substring(cookieStart+cookiename.length,cookieEnd); if(cookieValue.length >0){ subCookies = cookieValue.split("&"); for(var i=0,len=subCookies.length;i<len;i++){ parts = subCookies[i].split("="); result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]); } return result; } } return null; } };subcookie工具设置cookie值:
//设置单个键值对信息 set:function(name,subName,value,expires,path,domain,secure){ var subcookies = this.getAll(name)||{}; subcookies[subName] = value; this.setAll(name,subcookies,expires,path,domain,secure); }, //设置多个键值对信息(数组) setAll:function(name,subcookies,expires,path,domain,secure){ var cookieText = encodeURIComponent(name)+"=", subcookieParts = new Array(); subName; for(subName in subcookies){//遍历name值对象的属性 if(subName.length>0 && subcookies.hasOwnProperty(subName)){//确保只有实例属性被序列化到子cookie中 subcookieParts.push(encodeURIComponent(subName)+"="+encodeURIComponent(subcookies[subName])); } } if(subcookieParts.length>0){//键值对数组拼接成字符串 cookieText +=subcookieParts.join("&"); //拼接其他cookie属性值 if(expires instanceof Date){ cookieText +="; expires="+expires.toGMTString(); } if(path){ cookieText +="; path="+path; } if(domain){ cookieText +="; domain="+domain; } if(secure){ cookieText += "; secure"; } }else{ cookieText += "; expires="+(new Date(0).toGMTString()); } document.cookie = cookieText; }删除子cookie值: //删除子cookie unset:function(name,subName,path,domain,secure){ var subcookies = this.getAll(name); if(subcookies){ delete subcookies[subName];//删除数组中指定值,数组长度不变,值改为undefined this.setAll(name,subcookies,null,path,domain,secure); } }, //删除整个cookie unsetAll:function(name,path,domain,secure){ this.setAll(name,null,new Date(0),path,domain,secure); }由于cookie都会由浏览器作为请求头发送,所以在cookie中存储大量信息会影响到特定域的请求性能。cookie信息越大,完成对服务器请求的时间也就越长。所以尽可能在cookie中少存储信息,避免影响想能。
提供最大的存储空间(因浏览器而异)来存储名值对。提供方法如下:
clear():删除所有值getItem(name):根据指定的名字name获取对应的值key(index):获得index位置处的值的名字removeItem(name):删除由name指定的名值对setItem(name,value):为指定的name设置一个对应的值 storage类型只能存储字符串,非字符串的数据在存储前会被转成字符串存储某个特定会话的数据,该数据保持到浏览器关闭。存储在sessionStorage中的数据可以跨越页面刷新而存在。
因为sessionStorage对象绑定于某个服务器会话,所以当文本在本地运行的时候是不可用的。存储在sessionStorage中的数据只能由最初给对象存储数据的页面访问到,所以对多页面应用有限制。
//使用方法设置数据 sessionStorage.setItem("name","zhangsan"); //使用属性设置数据 sessionStorage.book = "math"; console.log(sessionStorage);//Storage {book: "math", name: "zhangsan", length: 2} 使用getItem或属性的方式访问数据: var name =sessionStorage.getItem("name"); var book = sessionStorage.book; 遍历获取sessionStorage中的名值对: for(var i =0,len=sessionStorage.length;i<len;i++){ var key = sessionStorage.key(i); var value = sessionStorage.getItem(key); console.log(key+"="+value); } for(var key in sessionStorage){//不会返回内置方法或length属性 value = sessionStorage.getItem(key); console.log(key+"="+value); } delete删除属性或removeItem()方法删除数据: delete sessionStorage.name; sessionStorage.removeItem("book");存储数据的规则是固定的。要访问同一个globalStorage对象,页面必须来自同一个域名(子域名无效),使用同一种协议,在同一个端口上。
localStorage也是Storage的实例,所以可以像使用sessionStorage一样来使用它。
localStorage.setItem("name","zhangsan"); localStorage.book = "math"; var name = localStorage.name; var book = localStorage.getItem("book"); 数据保留到通过JavaScript删除或者是用户清除浏览器缓存。对Storage对象进行任何修改,都会在文档上触发storage事件。
通过属性或setItem()方法保存数据使用delete操作符或removeItem()删除数据调用clear()方法event对象有一下属性:
domain:发生变化的存储空间的域名。key:设置或删除的键名newValue:如果是设置值,则是新值;如果是删除键,则是nulloldValue:键被更改之前的值 //chrome不支持? window.addEventListener("storage",function(event){ console.log(event); },false); localStorage.setItem("name","zhangsan");对存储空间大小的限制都是以每个来源(协议,域,端口)为单位的。每个源都有固定大小的空间用于保存自己的数据。
localStorage:5MB大小限制,chrome限制2.5MB
sessionStorage:2.5MB
