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 settings\userName\cookie\文件夹下。通常的命名格式为: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

javascript中的cookie相关推荐

  1. 在JavaScript中操作Cookie

    在Windows系统中,cookie通常是被储存在C:\Documents and settings\用户名\cookie目录下(如果系统在C盘).其实每个cookie实际上就是一个文本文件,里面是用 ...

  2. javascript中的cookie问题

    在他处看到一篇好文章,想记录在自己的学习笔记中,原文作者看到我转载若是介意,联系我立马就删除,附上原文链接: http://blog.csdn.net/sunhengzhe/article/detai ...

  3. Javascript中操作cookie

    $.cookie = {/** * 读取cookie * * @param {String} n=名称 * @return {String} cookie值 * @example * $.cookie ...

  4. javascript中sessionStorage 、localStorage 和 Cookie

    javascript中sessionStorage .localStorage 和 Cookie 欢迎访问我的博客,祝码农同胞们早日走上人生巅峰,迎娶白富美~~~ 参考文章:JS 详解 Cookie. ...

  5. html页面怎么删除cookie,javascript中怎么删除cookie?

    当web服务器向浏览器发送网页后,连接被关闭,服务器会忘记用户的一切.Cookie是为了解决"如何记住用户信息"而发明的.有时为了我们的信息安全需要删除Cookie,我们该如何做呢 ...

  6. JavaScript中的字符串操作(转)

    http://www.cnblogs.com/xuebin/articles/1296837.html 最近编一个javascript的翻译程序,发现无法正确比较两个字符串的相等,上网查了查,发现这篇 ...

  7. JavaScript中的load事件的作用_史上最全的web前端面试题汇总及答案JavaScript之二(二)...

    作者:樱桃小丸子儿 链接:https://www.jianshu.com/p/abadcc84e2a4 JavaScript JS的基本数据类型 number,string,boolean,objec ...

  8. Django 中的 cookie 和 session

    一.cookie 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新的 ...

  9. JavaScript中window.open用法实例详解

    本文较为详细的分析了JavaScript中window.open用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: <script LANGUAGE="javascript& ...

  10. JavaScript之document.cookie

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

最新文章

  1. java 操作 redis_java操作Redis
  2. etymon word write alb pain high alt increase large agency ag lose weight fat assist out~3
  3. mysql 表结构关系_mysql 表关系 与 修改表结构
  4. Object-C中self和super的区别
  5. Android 系统(159)----MTK 平台过CTA时,发生权限未明示问题
  6. 南方CASS11.0.0.8下载安装教程附视频(日更)
  7. Windows安装宝塔后跳过绑定手机号
  8. 26 | Superscalar和VLIW:如何让CPU的吞吐率超过1
  9. Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (10061),错误代码2003
  10. wamp php imagick,wamp2.5安装imagick
  11. 解读机械图样——局部视图
  12. Python学习笔记之汉诺塔游戏
  13. JavaScript核心Web APIs
  14. 基尔霍夫定律及其应用
  15. FICO 里面的替代和校验 以及调试
  16. 2.0 JAVA线性表
  17. science 近些年上发表的关于网络人工智能等内容汇总
  18. Android实现 制作隐藏图片效果 (幻影坦克)
  19. 嵌入式项目实战——基于QT的视频监控系统设计(三)
  20. Java 8新特性:Optional类

热门文章

  1. Hive查询各自区组的money排名前十的账号
  2. MFC程序减少体积的方法
  3. 调用sklearn包中的PLA算法[转载]
  4. 【火炉炼AI】机器学习042-NLP文本的主题建模
  5. java GC 参数
  6. input 密码框调出手机的数字键盘
  7. DTCMS自定义标签,获取所有栏目文章列表TOP,以及文章通用URL
  8. sqoop遇到的问题
  9. 对break和continue的一些个人认知(称不上见解)
  10. Stream篇(2)【TextReader】