JavaScript核心之Cookie详解

目录

1 cookie

1.1 cookie概述

1.1.1 cookie的工作原理

1.1.2 cookie的工作流程

1.2 cookie的属性

1.2.1 HTTP-Only cookie

1.3 cookie的限制

1.4 Cookie的设置

1.4.1 在浏览器中的设置

1.4.2 在注册表中的设置


1 cookie

1.1 cookie概述

cookie是服务器要求浏览器保存的一段信息。以后,浏览器每次向服务器发出请求,就会自动附上这段信息

document.cookie属性返回当前网页的cookie

// 读取当前网页的所有cookie
allCookies = document.cookie;

该属性是可写的,但是一次只能写入一个cookie,也就是说写入并不是覆盖,而是添加。另外,cookie的值必须对分号、逗号和空格进行转义。

// 写入一个新cookie
document.cookie = "test1=hello";
// 再写入一个cookie
document.cookie = "test2=world";

document.cookie
// test1=hello;test2=world

document.cookie属性的读写操作含义不同,跟服务器与浏览器的通信格式有关。浏览器向服务器发送cookie,是一次性所有cookie全部发送。

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: cookie_name1=cookie_value1; cookie_name2=cookie_value2
Accept: */*

服务器告诉浏览器需要储存cookie,则是分行指定。

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: cookie_name1=cookie_value1
Set-Cookie: cookie_name2=cookie_value2; expires=Sun, 16 Jul 3567 06:23:41 GMT

cookie的值可以用encodeURIComponent方法进行处理,对逗号、分号、空格进行转义(这些符号都不允许作为cookie的值)。

1.1.1 cookie的工作原理

       cookie是在浏览器访问web服务器的某个资源时,有web服务器在http响应消息头文件中附带传递给浏览器的一些数据。如果浏览器保存了这些数据,当它每次访问该web服务器时,都应在HTTP请求头文件中将这些数据回传给web服务器。web服务器将这些数据在HTTP请求头文件中使用set-cookie响应头字段将cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加cookie请求字段将cookie回传给web服务器,一个cookie只能表示一种信息。一个web服务器可以给浏览器发送多个cookie,这样web服务器和浏览器之间可以使用多个cookie来传递多种信息。

1.1.2 cookie的工作流程

     当用户在浏览器地址中输入一个web服务器的URL时,浏览器向web服务器发送一个读取网页的请求,web服务器将返回结果给浏览器,并将页面显示在浏览器上,同时该web服务器在用户的计算机上寻找相应的cookie文件,如果找到,浏览器会将cookie文件中的字符串连同前面用户输入的URL一起发送到web服务器中,服务器收到cookie数据将检索此用户的相关信息,并增加相应的内容,写入cookie中;如果web服务器在用户的电脑上没有找到相应的cookie文件,说明用户是第一次访问此网站,则浏览器只想服务器发送URL,不发生cookie数据,服务器没有接收到cookie数据,将cookie数据放入网页的头文件传递给客户端,浏览器会将cookie数据保存在本地电脑中。

1.2 cookie的属性

除了cookie本身的内容,还有一些可选的属性也是可以写入的,它们都必须以分号开头。

 尽量不要使用set-cookie:这种命令格式,而是使用document.cookie的语法格式,要不然报错报的你头大!!!

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
  • ; path=path,指定路径,必须是绝对路径(比如'/','/mydir'),如果未指定,默认为设定该cookie的路径。只有path属性匹配向服务器发送的路径,cookie才会发送。这里的匹配不是绝对匹配,而是从根路径开始,只要path属性匹配发送路径的一部分,就可以发送。比如,path属性等于/blog,则发送路径是/blog或者/blogroll,cookie都会发送。path属性生效的前提是domain属性匹配。
  • ; domain=domain,指定cookie所在的域名,比如'example.com','.example.com'(这种写法将对所有子域名生效)、'subdomain.example.com'。如果未指定,默认为设定该cookie的域名。所指定的域名必须是当前发送cookie的域名的一部分,比如当前访问的域名是example.com,就不能将其设为google.com。只有访问的域名匹配domain属性,cookie才会发送到服务器。
  • ; max-age=max-age-in-seconds,指定cookie有效期,比如606024*365(即一年31536e3秒)。
  • ; expires=date-in-GMTString-format,指定cookie过期时间,日期格式等同于Date.toUTCString()的格式。如果不设置该属性,则cookie只在当前会话(session)有效,浏览器窗口一旦关闭,当前session结束,该cookie就会被删除。浏览器根据本地时间,决定cookie是否过期,由于本地时间是不精确的,所以没有办法保证cookie一定会在服务器指定的时间过期。
  • ; secure,指定cookie只能在加密协议HTTPS下发送到服务器。该属性只是一个开关,不需要设定值。在HTTPS协议下设定的cookie,该开关自动打开。

以上属性可以同时设置一个或多个,也没有次序的要求。如果服务器想改变一个早先设置的cookie,必须同时满足四个条件:cookie的名字、domain、path和secure。也就是说,如果原始的cookie是用如下的Set-Cookie头命令设置的。

Set-Cookie: key1=value1; domain=example.com; path=/blog

改变上面这个cookie的值,就必须使用同样的Set-Cookie命令。

Set-Cookie: key1=value2; domain=example.com; path=/blog

只要有一个属性不同,就会生成一个全新的cookie,而不是替换掉原来那个cookie。

Set-Cookie: key1=value2; domain=example.com; path=/

上面的命令设置了一个全新的同名cookie。下一次访问example.com/blog的时候,浏览器将向服务器发送两个同名的cookie。

Cookie: key1=value1; key1=value2

上面代码的两个cookie是同名的,匹配越精确的cookie排在越前面。

var str = 'someCookieName=true';
str += '; expires=Fri, 31 Dec 9999 23:59:59 GMT';
str += '; path=/';

document.cookie = str;

另外,上面这些cookie属性只能用来设置cookie。一旦设置完成,就没有办法从某个cookie读取这些属性的值。

删除一个cookie的简便方法,就是设置expires属性等于0。

1.2.1 HTTP-Only cookie

设置cookie的时候,如果服务器加上了HTTPOnly属性,则这个cookie无法被JavaScript读取(即document.cookie不会返回这个cookie的值),只用于向服务器发送。

Set-Cookie: key=value; HttpOnly

上面的这个cookie将无法用JavaScript获取。进行AJAX操作时,getAllResponseHeaders方法或getResponseHeader方法也不会显示这个头命令。

1.3 cookie的限制

浏览器对cookie的数量和长度有限制,但是每个浏览器的规定是不一样的。

  • IE6:每个域名20个cookie。
  • IE7,IE8,Firefox:每个域名50个cookie
  • Safari,Chrome:没有域名数量的限制。

所有cookie的累加长度限制为4KB。超过这个长度的cookie,将被忽略,不会被设置。

由于cookie存在数量限制,有时为了规避限制,可以将cookie设置成下面的形式。

name=a=b&c=d&e=f&g=h

上面代码实际上是设置了一个cookie,但是这个cookie内部使用&符号,设置了多部分的内容。因此,可以在一个cookie里面,通过自行解析,可以得到多个键值对。这样就规避了cookie的数量限制。

1.4 Cookie的设置

1.4.1 在浏览器中的设置

(1)选择浏览器菜单栏中的“工具”——》“Internet选项”,然后在弹出对话框的“常规”选项卡中的“删除”按钮,即可将磁盘中的cookie删除

(2)在“隐私”选项卡,调整隐私设置滑块,设置浏览器对cookie允许使用的程度

(3)如果只是为了进制个别网站的cookie,在“隐私”选项卡中点击“站点”按钮,弹出“每站点的隐私操作”对话框,将要屏蔽的网站添加到列表框中,然后单击“拒绝”按钮,即可禁用个别网站的cookie

(4)可以在浏览器中对第一方cookie和第三方cookie设置,第一坊cookie是指用户正在浏览的网站的cookie,第三方cookie是指非正在浏览的网站发给用户的cookie。任然是在隐私选项卡中,单击“高级”俺就,弹出“高级隐私策略设置”对话框,选中覆盖自动cookie处理复选框,然后在第三方cookie选择区域下选中“拒绝”单选按钮

1.4.2 在注册表中的设置

有一些特殊的cookie不是一文本文件形式存在,而是保存在内存中,这类cookie通常是用户在访问某些特殊网站是,由系统在内存中生成的,一旦访问者离开,网站会自动将cookie从内存中删除

(1)在“开始/运行”命令,然后在弹出的“运行”对话框”打开文本框中输入“regedit”,然后单击确定按钮,打开“注册表编辑器”窗口

(2)在“注册表编辑器”窗口依次展开 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Internet Settings/Cache/Special Paths/Cookies分支,右击cookie,在弹出的快捷菜单中选择“删除”命令,即可将cookie禁用

猜你喜欢

转载自blog.csdn.net/u012060033/article/details/89713127