发布日期:2016-05-31 12:18:00

了解cookie的实际存储对真正了解cookie, session等概念有更好的帮助。

我们知道Session是存在服务器端的,而cookie是存在客户端的。这里准确理解应该是说由客户端的浏览器管理。浏览器管理着所有客服端的数据。不同的浏览器实现不同,主要功能除了实现DOM的显示和渲染,以及内嵌的javascript引擎等功能外,对客服端的数据管理也是一大功能。

由于cookie 等客户端数据由各浏览器管理,从Cookie的存储方式来分,可以看成有两种Cookie:持久化cookie(内存cookie)非持久化cookie(硬盘cookie)

非持久化cookie存放在浏览器内存中,浏览器关闭后,这类cookie的生命周期结束。这类cookie也有称为会话cookie。会话结束后它也结束。不设置过期时间。

而持久化cookie就是由浏览器器存放在硬盘中,它们存储的位置也相应的跟着浏览器application Data走。这类cookie除非用户手工清理或到了过期时间,否则不会被删除。

这是不同浏览器的cookie存储大致位置:

chrome存放cookie的路径:  C:\Documents and Settings\Administrator\Local Settings\Application Data\Google\Chrome\User Data\Default

firefox存放cookie的路径:C:\Documents and Settings\Administrator\Local Settings\Application Data\Mozilla\Firefox\Profiles\xxxxxxxxx.default\OfflineCache

360技术浏览器的cookie在: C:\Documents and Settings\Administrator\Local Settings\Application Data\360Chrome\Chrome\User Data\Default

先了解下Chrome的cookie的存储:

  1. 通过 Chrome 的 dev tool(F12) 可以看到当前网页的Resource(Frame,Local Storage, Web SQL, IndexedDB, Session Storage, Cookies, Application Cache, cache Storage, Service workers)。
  2. 进入Chrome的AppData
  3. 打开该Cookies文件,我们可以看到Chrome自己管理cookies的文件格式,所以看到的是乱码,但是还是可以看出一些端倪,如本站的网站。
  4. 这些cookies来源有几个地方:1)服务器端的response header中传过来的,即通过服务器端的脚本设置的。2)客服端自身产生的,如通过javascript脚本来设置的。如Java以及PHP以及javascript中设置cookie的代码如下:
    cookie = new Cookie("cookiename","cookievalue"); 
    cookie.setMaxAge(3600); 
    cookie.setPath("/");
    response.addCookie(cookie);
    <?php 
    setcookie("user", "Alex Porter", time()+3600);
    ?>
    function SetCookie(name,value)
    {
        var Days = 30; //此 cookie 将被保存 30 天
        var exp  = new Date();    //new Date("December 31, 9998");
        exp.setTime(exp.getTime() + Days*24*60*60*1000);
        document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
    }
    
    function getCookie(name)//取cookies函数        
    {
        var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
         if(arr != null) return unescape(arr[2]); return null;
    
    }
    function delCookie(name)//删除cookie
    {
        var exp = new Date();
        exp.setTime(exp.getTime() - 1);
        var cval=getCookie(name);
        if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();
    }

     

  5. 这些cookie会在访问对应网站的时候,浏览器会设置对应的request header中的cookies值,从而传给服务器端。服务器端脚本可以做响应的处理。如Java以及PHP中读取cookie的代码如下:
    Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组
    for(Cookie cookie : cookies){
        cookie.getName();// get the cookie name
        cookie.getValue(); // get the cookie value
    }
    <?php
    // Print a cookie
    echo $_COOKIE["user"];
    
    // A way to view all cookies
    print_r($_COOKIE);
    ?>
  6. 浏览器自身都有对cookie的管理设置。 Chrome的内容设置中提供的cookie的管理工具

 

发表评论