javascript中的cookie

Cookie是怎样工作的?

一般来说,Cookie通过HTTP Headers从服务器端返回 到浏览器上。首先,服务器端在响应中利用Set-Cookie header来创建一个Cookie ,然后,浏览器在它的请求中通过Cookie header包含这个已经创建的Cookie,并且反它返回至服务器,从而完成浏览器的论证。

例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header 如下面所示,这里假设访问者的注册名是“Michael Jordan”,同时还对所创建的Cookie的属性如path、
domain、expires等进行了指定。

  Set-Cookie:login=Michael Jordan;path=/;domain=msn.com;
  expires=Monday,01-Mar-ArrayArray 00:00:01 GMT

  上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login” 的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个Cookie的值是经过了URLEncode方法的 URL编码操作的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器 将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。

说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。

一、设置cookie时的注意事项
在同一个页面中设置cookie,实际上是按从后往前的顺序进行的.如果要先删除一个cookie,再写入一个cookie,则必须先写写入语句,再写删除语句.否则会出现错误.

如果要设置同名的多个Cookie,要用数组,方法是:

SetCookie("CookieArray[]", "Value 1");
SetCookie("CookieArray[]", "Value 2");

  或

SetCookie("CookieArray[0]", "Value 1");
SetCookie("CookieArray[1]", "Value 2");

二、关于cookie的路径设置
cookie是面向路径的.缺省path属性时,WEB服务器页会自动传递当前路径给浏览器.指定路径会强制服务器使用设置的路径.在一个目录页面里设的cookie在另一个目录的页面里是看不到的.

、接收和处理Cookie

三、内存cookie与持久cookie

如 果不设置cookie过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览 器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器 就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

存 储在硬盘上的 cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开 的窗口上按Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 Mozilla Firefox、chrome、IE8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打 开的窗口会与原窗口共享内存cookie。

另外参考:http://hhlux.iteye.com/blog/334729

一:JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求。cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript。可以由JavaScript对其进行控制,并不是JavaScript本身的性质

二:cookie是存于用户硬盘的一个文件,这个文件通常对应于一个域名,当浏览器再次访问这个域名时,便使这个cookie可用。因此,cookie可以跨越一个域名下的多个网页,但不能跨越多个域名使用。 不同的浏览器对cookie的实现也不一样,但其性质是相同的。例如在Windows 2000以及Windows xp中,cookie文件存储于documents and settingsuserNamecookie文件夹下。通常的命名格式为:userName@domain.txt。 如:

cookie机制将信息存储于用户硬盘,因此可以作为全局变量,这是它最大的一个优点。它可以用于以下几种场合。 

(1)保存用户登录状态。例如将用户id存储于一个cookie内,这样当用户下次访问该页面时就不需要重新登录了,现在很多论坛和社区都提供这样的功能。 cookie还可以设置过期时间,当超过时间期限后,cookie就会自动消失。因此,系统往往可以提示用户保持登录状态的时间:常见选项有一个月、三个 月、一年等。 

(2)跟踪用户行为。例如一个天气预报网站,能够根据用户选择的地区显示当地的天气情况。如果每次都需要选择所在地是烦琐的,当利用了 cookie后就会显得很人性化了,系统能够记住上一次访问的地区,当下次再打开该页面时,它就会自动显示上次用户所在地区的天气情况。因为一切都是在后 台完成,所以这样的页面就像为某个用户所定制的一样,使用起来非常方便。 

(3)定制页面。如果网站提供了换肤或更换布局的功能,那么可以使用cookie来记录用户的选项,例如:背景色、分辨率等。当用户下次访问时,仍然可以保存上一次访问的界面风格。 

(4)创建购物车。正如在前面的例子中使用cookie来记录用户需要购买的商品一样,在结账的时候可以统一提交。例如淘宝网就使用cookie记录了用户曾经浏览过的商品,方便随时进行比较。 

当然,上述应用仅仅是cookie能完成的部分应用,还有更多的功能需要全局变量。cookie的缺点主要集中于安全性和隐私保护。主要包括以下几种: 

(1)cookie可能被禁用。当用户非常注重个人隐私保护时,他很可能禁用浏览器的cookie功能; 
(2)cookie是与浏览器相关的。这意味着即使访问的是同一个页面,不同浏览器之间所保存的cookie也是不能互相访问的; 
(3)cookie可能被删除。因为每个cookie都是硬盘上的一个文件,因此很有可能被用户删除; 
(4)cookie安全性不够高。所有的cookie都是以纯文本的形式记录于文件中,因此如果要保存用户名密码等信息时,最好事先经过加密处理。 

设置cookie 
每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: 

document.cookie="userId=828"; 
如果要一次存储多个名/值对,可以使用分号加空格(; )隔开,例如: 

document.cookie="userId=828; userName=hulk"; 
在cookie 的名或值中不能使用分号(;)、逗号(,)、等号(=)以及空格。在cookie的名中做到这点很容易,但要保存的值是不确定的。如何来存储这些值呢?方 法是用escape()函数进行编码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“20%”,从而可以存储于cookie值中,而且使用此 种方案还可以避免中文乱码的出现。例如: 

document.cookie="str="+escape("I love ajax");  相当于  document.cookie="str=I%20love%20ajax"; 

注意:当使用escape()编码后,在取出值以后需要使用unescape()进行解码才能得到原来的cookie值

尽管document.cookie看上去就像一个属性,可以赋不同的值。但它和一般的属性不一样,改变它的赋值并不意味着丢失原来的值,例如连续执行下面两条语句: 

document.cookie="userId=828"; 
document.cookie="userName=hulk"; 

这时浏览器将维护两个cookie,分别是userId和userName,因此给document.cookie赋值更像执行类似这样的语句: 

如果要改变一个cookie的值,只需重新赋值,例如: 
document.cookie="userId=929"; 
这样就将名为userId的cookie值设置为了929。

获取cookie的值  :通过document.cookie

给cookie设置终止日期 

默认情况下, 所有的cookie都是单会话cookie,即浏览器关闭后这些cookie将会丢失,事实上这些cookie仅仅是存储在内存中,而没有建立相应的硬盘文件。 

如果设置有时间限制,则 如这样:document.cookie="userId=828; expiress=GMT_String";   其中GMT_String是以GMT格式表示的时间字符串

如:

<script language="JavaScript" type="text/javascript"> 
<!-- 
//获取当前时间 
var date=new Date(); 
var expiresDays=10; 
//将date设置为10天以后的时间 
date.setTime(date.getTime()+expiresDays*24*3600*1000); 
//将userId和userName两个cookie设置为10天后过期 
document.cookie="userId=828; userName=hulk; expires="+date.toGMTString(); 
//--> 
</script> 

删除cookie : 设置时间为过去的时间

指定可访问cookie的路径 

默认情况下,如果在某个页面创建了一个cookie,那么该页面所在目录中的其他页面也可以访问该cookie。如果这个目录下还有子目录,则在子目录中也可以访问。例如在www.xxxx.com/html/a.html中所创建的cookie,可以被www.xxxx.com/html/b.html或www.xxx.com/ html/ some/c.html所访问,但不能被www.xxxx.com/d.html访问。 

为了控制cookie可以访问的目录,需要使用path参数设置cookie,语法如下: 

document.cookie="name=value; path=cookieDir"; 
其中cookieDir表示可访问cookie的目录。例如: 

document.cookie="userId=320; path=/shop"; 
就表示当前cookie仅能在shop目录下使用。 

如果要使cookie在整个网站下可用,可以将cookie_dir指定为根目录,例如: 

document.cookie="userId=320; path=/"; 

指定可访问cookie的主机名 
和路径类似,主机名是指同一个域下的不同主机,例如:www.google.com和gmail.google.com就是两个不同的主机名。默认情况下,一个主机中创建的cookie在另一个主机下是不能被访问的,但可以通过domain参数来实现对其的控制,其语法格式为: 

document.cookie="name=value; domain=cookieDomain"; 
以google为例,要实现跨主机访问,可以写为: 

document.cookie="name=value;domain=.google.com"; 
这样,所有google.com下的主机都可以访问该cookie。 

cookie 安全性解释:

在Cookie文件中保存Cookie,一些用户会过分地认为这将带来很大的问题。主要是有些用户担心Cookie 会跟踪用户网上冲浪的习惯,譬如用户喜爱到那些类型的站点、爱从事些什么活动等。害怕这种个人信息一 旦落入一些别有用心的家伙手中,那么个人也就可能成为一大堆广告垃圾的对象,甚至遭到意外的损害。不过,这种担心压根儿不会发生,因为网站以外的用户是无法跨过网站来获得Cookie信息的

php中的cookie
  PHP对Cookie的接收和处理的支持非常好,是完全自动的,跟FORM变量的原则一样,特别简单。比如设 置一个名为MyCookier的Cookie,PHP会自动从WEB服务器接收的HTTP头里把它分析出来,并形成一个与普通 变量一样的变量,名为$myCookie,这个变量的值就是Cookie的值。数组同样适用。另外一个办法是引用PHP 的全局变量$HTTP_COOKIE_VARS数组。

  分别举例如下:(假设这些都在以前的页面里设置过了,并且仍然有效)
echo $MyCookie;
echo $CookieArray[0];
echo count($CookieArray);
echo $HTTP_COOKIE_VARS["MyCookie"]; bitsCN.Com

下面的例子列出几种情形交互场景,列出JS和php交互的方法。总结下,以免日后再为cookie问题困扰。

setcookie.php

01 <?php
02     setcookie('php_cn_ck','php_中文_cookie');
03     setcookie('php_en_ck','php_english_cookie');
04 ?>
05  
06 <script src="cookie.js"></script>
07 <script>
08     Cookies.set('js_cn_ck','js_中文_cookie',5000);
09     Cookies.set('js_en_ck','js_english_cookie');
10 </script>
11  
12 <meta http-equiv="Content-Type" content="text/html; charset=utf8">
13 PHP cookie已经设置<br>php_cn_ck=php_中文_cookie<br>php_en_ck=php_english_cookie<br><br>
14 JS cookie已经设置<br>js_cn_ck=js_中文_cookie<br>js_en_ck=js_english_cookie<br><br>
15 <a href=getcookie.php>读取cookie</a><br>

getcookie.php

01 <meta http-equiv="Content-Type" content="text/html; charset=utf8">
02 一 读取php传送的中英文cookie<br><br>
03 <p>1 php读取php设置php cookie<br><br>
04  
05 <?php
06     include('function.php');
07     $php_cn_ck=$_COOKIE['php_cn_ck'];
08     $un_php_cn_ck=unescape($php_cn_ck);
09     echo "解码前的中文cookie:php_cn_ck=$php_cn_ck<br><br>";
10     echo "解码后的中文cookie:un_php_cn_ck=$un_php_cn_ck<br><br>";
11     $php_en_ck=$_COOKIE['php_en_ck'];
12     echo "英文cookie无需解码:php_en_ck=$php_en_ck<br><br>";
13 ?>
14  
15 <p>2 js读取php设置cookie<br><br>
16 <script src="cookie.js"></script>
17 <script>
18     php_cn_ck=Cookies.get('php_cn_ck');
19     un_php_cn_ck = decodeURIComponent (escape(php_cn_ck));
20     document.write("解码前的中文cookie :php_cn_ck="+php_cn_ck+"<Br><br>");
21     document.write("解码后的中文cookie :un_php_cn_ck="+un_php_cn_ck+"<Br><br>");
22     php_en_ck=Cookies.get('php_en_ck');
23     document.write("英文cookie无需解码 :php_en_ck="+php_en_ck+"<Br><br>");
24 </script>
25 -----------------------------------------------<br>
26 二 读取JS传送的中英文cookie<br><br>
27 <p>1 php读取JS设置js cookie<br><br>
28 <?php
29     $js_cn_ck=$_COOKIE['js_cn_ck'];
30     $un_js_cn_ck=unescape($js_cn_ck);
31     echo "解码前的中文cookie:js_cn_ck=$js_cn_ck<br><br>";
32     echo "解码后的中文cookie:un_js_cn_ck=$un_js_cn_ck<br><br>";
33     $js_en_ck=$_COOKIE['js_en_ck'];
34     echo "英文cookie无需解码:js_en_ck=$js_en_ck<br><br>";
35 ?>
36 </p>
37 <p>2 js读取js设置的cookie<br><br>
38 <script>
39     js_cn_ck=Cookies.get('js_cn_ck');
40     document.write("解码前的中文cookie :js_cn_ck="+js_cn_ck+"<Br><br>");
41     //un_js_cn_ck = decodeURIComponent (escape(js_cn_ck)); 调用这两句会出现js解析中断
42     //document.write("解码后的中文cookie :un_js_cn_ck="+un_js_cn_ck+"<Br><br>");
43     js_en_ck=Cookies.get('js_en_ck');
44     document.write("英文cookie无需解码 :js_en_ck="+js_en_ck+"<Br><br>");
45 </script>
46 </p>

总结:

  1. php用自身函数读取php 的cookie,没有任何障碍,无需解码处理。
  2. js采用cookie.js方法读取js 的cookie,没有任何障碍,无需解码处理。
  3. js读取php的中文cookie,需要做 "decodeURIComponent (escape(php_cn_ck)) "函数处理
  4. php读取js的中文cookie 需要做 "unescape()" 函数处理

cookie.js

	var Cookies = {}; 
	/** 
	* 设置Cookies 
	*/ 
	Cookies.set = function(name, value){ 
		var argv = arguments; 
		var argc = arguments.length; 
		var expires = (argc > 2) ? argv[2] : null; 
		if(expires != null){ 
        	var exp   = new Date(); 
	 		exp.setTime(exp.getTime() + 8*3600 + expires); 
		} 
		alert(exp.toGMTString()); 
		var path = (argc > 3) ? argv[3] : '/'; 
		var domain = (argc > 4) ? argv[4] : null; 
      	var secure = (argc > 5) ? argv[5] : false; 
		document.cookie = name + "=" + escape (value) + 
		((expires == null) ? "" : ("; expires=" + exp.toGMTString())) + 
		((path == null) ? "" : ("; path=" + path)) + 
		((domain == null) ? "" : ("; domain=" + domain)) + 
		((secure == true) ? "; secure" : ""); 
	}; 
	/** 
	* 读取Cookies 
	*/ 
	Cookies.get = function(name){ 
		var arg = name + "="; 
		var alen = arg.length; 
		var clen = document.cookie.length; 
		var i = 0; 
		var j = 0; 
		while(i < clen){ 
			j = i + alen; 
			if (document.cookie.substring(i, j) == arg) 
				return Cookies.getCookieVal(j); 
			i = document.cookie.indexOf(" ", i) + 1; 
			if(i == 0) 
				break; 
		} 
		return null; 
	}; 
	/** 
	* 清除Cookies 
	*/ 
	Cookies.clear = function(name) { 
		if(Cookies.get(name)){ 
		var expdate = new Date();  
		expdate.setTime(expdate.getTime() - (86400 * 1000 * 1));  
		Cookies.set(name, "", expdate);  
	} 
}; 
	Cookies.getCookieVal = function(offset){ 
		var endstr = document.cookie.indexOf(";", offset); 
		if(endstr == -1){ 
			endstr = document.cookie.length; 
		} 
		return unescape(document.cookie.substring(offset, endstr)); 
	}; 
   
原文地址:https://www.cnblogs.com/Alight/p/3261493.html