• 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)); 
    	}; 
    
       
  • 相关阅读:
    Web自动化测试项目搭建(一) 需求与设计
    Python
    Selenium(七):截图显示等待
    14、ABPZero系列教程之拼多多卖家工具 新建微信公众号模块
    13、ABPZero系列教程之拼多多卖家工具 微信公众号开发前的准备
    12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现
    11、ABPZero系列教程之拼多多卖家工具 拼团提醒功能页面实现
    10、ABPZero系列教程之拼多多卖家工具 拼团提醒逻辑功能实现
    9、ABPZero系列教程之拼多多卖家工具 拼团提醒类库封装
    8、ABPZero系列教程之拼多多卖家工具 添加手机注册登录功能
  • 原文地址:https://www.cnblogs.com/Alight/p/3261493.html
Copyright © 2020-2023  润新知