cookie
HTTP Cookie,是在客户端用于存储会话信息的。规范要求服务器对任意HTTP请求发送Set-Cookie HTTP头作为响应的一部分,其中包含会话信息。浏览器会存储这样的会话信息,并在这之后,通过为每个请求添加Cookie HTTP头将信息发送给服务器。Http协议是无状态的,对于同一个浏览器发出的多个请求,web服务器是无法区分来源,cookie在客户端解决这个问题。发送回服务器的额外信息可以用于验证请求是来自哪个客户。
限制:
① Cookie无法跨域,只能是相同域、相同协议内使用。
② 每个域的Cookie总数是有限的。当超过单个域名数量限制之后,浏览器会根据自身规则清除以前设置的cookie。
③ 浏览器中对于cookie的大小也有限制,一般一个域下所有的cookie大小不超过4kb,如果超过那么该cookie就会被悄无声息地丢掉。
cookie的字段
name:必须,名称是不分大小写的,实践中最好是将cookie名称看做是区分大小写的,因为某些服务器会处理cookie。在传送时必须被URL编码。
value:必须,cookie的字符串值。在传送时必须被URL编码。
domain:该cookie对于哪个域是有效的。所有从该域资源内发出的请求都会包含这个cookie信息。如果没有明确设定,那么这个域会被认作来自设置cookie的那个域。
path:指定域中的哪个路径,应该向服务器发送cookie信息。
expires/Max-Age :当前cookie何时应该被删除的时间戳。若设置其值为一个时间(GMT格式的日期,注意客户端的时区设定),那么当到达此时间后,此cookie会被删除。如果设置的值是负值或0,cookie也会被立即删除。不显示设置的话默认值是session,即cookie和session的有效期一样。当浏览器关闭后(不是浏览器窗口标签,而是浏览器应用) ,会话结束,cookie/session被清除。
HttpOnly:若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。
secure :cookie只有在使用SSL连接的时候才发送到服务器。
JavaScript中的cookie
document.cookie返回当前可用的(根据cookie的域、路径、失效日期和安全设置)所有的cookie字符串,每条记录由分号隔开(如name1=value1;name2=value2)。
注意:
1.所有名字和值都是经过URL编码的,所以必须使用decodeURLComponent()来解码。
2.document.cookie也可以设置一个新的cookie字符串,这个cookie字符串会被解释并添加到现有的cookie集合中。设置document.cookie并不会覆盖cookie,除非设置的cookie的名称已经存在。一次只能设置一条cookie信息,多余的cookie会被丢弃。
document.cookie=”userName=kevin;expires=expiration_time”
3.javascript和动态页只能设置过期时间,无法获取cookie过期的时间,因为其他信息被浏览器隐藏,但在chrome的application下可以查看到失效时间。
It is not possible to get the expiration date of a cookie through Javascript; only key-value pairs are exposed through document.cookie
.
4.expires=NaN时,ie8下cookie被立即删除;ie8+及chrome时,会生效,有效时间为365天。
expries=0或负数时,当前cookie会被立即删除,不会被保存到内存中,也不会被持久化。
格林尼治时间(GMT)已经不再被作为标准时间使用,现在的标准时间为协调世界时(UTC),由原子钟提供。toUTCString()和toGMTString()在同一个浏览器中输出一样。
将对cookie的操作封装成JS库:
(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(factory); } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like enviroments that support module.exports, like Node. module.exports = factory(); } else { // Browser globals (root is window) root.Cookie = factory(); } }(this, function () { // Just return a value to define the module export. // This example returns an object, but the module // can return a function as the exported value. var Cookie = function () { this.set = function (name, value,days, path) { var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value); if (days) { var now = new Date(); now.setDate(now.getDate()+days); cookieText += "; expires=" +now.toUTCString(); } if (path) { cookieText += "; path=" + path; } document.cookie = cookieText; }; this.get = function (name){ var cookieName = encodeURIComponent(name) + '=', cookieStart = document.cookie.indexOf(cookieName), cookieValue = null; if (cookieStart > -1){ var cookieEnd = document.cookie.indexOf(";", cookieStart); if (cookieEnd == -1){ cookieEnd = document.cookie.length; } cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd)); } return cookieValue; }; this.del = function (name, path){ this.set(name, '',0, path); } }; return new Cookie; }));