cookie技术

cookie技术

引言:有时你需要记住访客们的一些东西:用户是否登录、用户是否已经投过票、用户权限验证、个性化身份、是否要记住用户登录状态……  为了能判断这些事情我们可以使用cookie技术。

cookie是存贮在用户电脑中。coockie内的有关信息是通过HTTP文件头来在web服务器和浏览器之间进行交流的.

上边这张图是淘宝首页的一张请求信息图,在这里cookie被自动发送,然后由服务器处理cookie载送的信息。

由于coockie内的有关信息是通过HTTP文件头来在web服务器和浏览器之间进行交流的。因此保持coockie尽可能的小以减少用户的响应时间十分重要。

1. cookie的成分

1.  名称

每一个cookie由唯一的一个名称代表。

2.  值

保存cookie中的字符串值。

3.  域 domain

为了安全,网站不能访问其他域创建的cookie。对于子域,假设我有一个域blog.dxk.com。如果我在www.dxk.com下设置cookie那么在blog.dxk.com下的页面就没有权限访问在www.dxk.com下设置的cookie。但是如果我在www.dxk.com下设置cookie时通过设置domain=dxk.com,那么这里设置的cookie就将与dxk.com的所有子域下的所有目录关联,在blog.dxk.com下的页面就有权限访问在www.dxk.com下设置的cookie。

4.  路径 path

为了安全,设置路径可以限制cookie与服务器的目录关联,如果path=/所有的cookie都将与服务器的根目录及子目录(也就是整个站点)相关联

5.  失效日期 expires

如果没有设定失效日期,那么它将在会话结束时被清除(也就是关闭浏览器时)。

6.  安全标志 secure

用于表示cookie是否只能从安全网站(使用ssl和https协议的网站)中访问。设置了secure属性不代表其他人不能看到你机器本 地保存的cookie。换句话说,把cookie设置为secure,只保证cookie与WEB服务器之间的数据传输过程加密,而保存在本地的 cookie文件并不加密。如果想让本地cookie也加密,需要自己加密数据。

2. cookie约束

浏览器对cookie使用的限制

web浏览器不能存储超过300个cookie,每个域不能存储超过20个cookie,cookie的名值对不能大于4kb。

3. javascript设置cookie

可以用navigator.cookieEnabled 判断浏览器是否支持cookie或者cookie是否被禁用。

每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie,比如:document.cookie=”WUHUI,DXKANDZXHANDMR”;在cookie的名值中不要使用空格、逗号、分号、等号 等符号。cookie值存储之前最好用encodeURIComponent()方法对其进行编码encodeURIComponent("http://www.dxk.com/dxk/test_wuhui/"),使用escape()方法也可以。当使用encodeURIComponent()或escape()编码后,在取出值以后需要使用对应的decodeURIComponent()或unescape()进行解码才能得到原来的cookie值。

设置方法示例:

<script type="text/javascript">

    varnowTime = new Date();

    nowTime.setMonth(nowTime.getMonth()+24);

    document.cookie = "ZXH="+encodeURIComponent("WUHUIAN ;DZXH") +"; path=/; expires="+nowTime.toGMTString()+ "; secure";

    alert(document.cookie);

</script>

 

注意事项:

1.  失效日期为GMT格式的日期(可以用Date对象中的静态方法toGMTString()方法)。如果你设置的日期是一个以前的日期那么这个cookie会被立即清除。

2.  只有字符串中的第一部分是必须的(即名值对),其余的都是可选的。path默认的是设置cookie是的当前目录,过期时间默认的是会话,安全默认的是false。另外比许将名值对写在cookie字符串的第一部分。

3.  在设置cookie的字符串的后边加上; secure则表示把cookie设置成安全的。

cookie常用方法封装:

/**

 * @author dxk

 * @deprecated cookie操作

 */

var cookie ={

 

    /**

     * 新建cookie

     * @param {string} name

     * @param {string} value

     * @param {number} days

     */

    "setCookie": function(name, value, days){

        if(days) {

            vardate = new Date();

            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));

            varexpires = "; expires=" +date.toGMTString();

        }

        else{

            varexpires = "";

        }

        varvalues = encodeURIComponent(value);

        document.cookie = name + "="+ values + expires + "; path=/";

    },

 

    /**

     * 获取cookie

     * @param {string} name

     */

    "getCookie": function(name){

        varnameEQ = name + "=";

        varcookieArr =document.cookie.split(';');

        for(vari = 0; i < cookieArr.length; i++) {

            varcurr = cookieArr[i];

           // 去除name前边的空格

            while(curr.charAt(0) == ' ')

                curr= curr.substring(1, curr.length);

            if(curr.indexOf(nameEQ) == 0)

                returncurr.substring(nameEQ.length, curr.length);

        }

        returnnull;

    },

 

    /**

     * 删除cookie

     * @param {string} name

     */

    "deleteCookie": function(name){

        if(name) {

            this.setCookie(name, "", "-1");

        }

    }

 

};

4. php设置cookie

setcookie($name,$value, $expire, $path, $domain, $secure, $httponly)

示例:
设置cookie
setcookie("zxh", "dxk", time()+30*24*60*60, "/");

if(isset($_COOKIE["zxh"]))

{

      echo $_COOKIE["zxh"]; // 获取cookie

}

删除cookie
setcookie("zxh", "", 0, "/");

注意事项:

1.  在php中可以使用以cookie的名称作为键的$_COOKIE结合数组来获取COOKIE的值。不过要确保php.ini中variables_order= "EGPCS"中包含C。

2.  cookie 是 HTTP标头的一部分,因此 setcookie()函数必须在其它信息被输出到浏览器前调用,这和对header()函数的限制类似。可以使用输出缓冲函数来延迟脚本的输出,直到按需要设置好了所有的cookie 或者其它 HTTP标头。

3.  也可以使用setrawcookie()但是它不会对cookie value进行url encoding处理

5. 注意事项

1.  因为某些原因cookie的名声很不好。许多人利用cookie做一些卑鄙的事情,比如流量分析、点击跟踪、窃取用户隐私。cookie也不是非常安全,特别是没有secure属性的cookie。不过,即使你用了安全的cookie,如果你和别人共用计算机,比如在网吧,那么别人就 可以窥探计算机硬盘上未加密保存的cookie文件,也就有可能窃取你的敏感信息。所以,如果你是一个WEB开发人员,那么你要认真考虑这些问题。不要滥用cookie。不要把用户可能认为是敏感的数据保存在cookie里。如果把用户的社会保险号、信用卡号等保存在cookie里,等于把这些敏感信 息放在窗户纸下,无异于把用户投到极大危险之中。另外一些cookie数据一定要进行加密

2.  另外,cookie还有一些实际的限制。cookie保留在计算机上,不跟着用户走。如 果用户更换计算机、或者使用不同的浏览器,那么就无法得到原来的 cookie。

3.  此外,如果用户有时不愿意接受cookie,可能会禁用cookie。所以不要以为所有的浏览器都能接受你发出的cookies。不要过分的去依赖cookie。

4.  简而言之,不要依赖cookies的存在;不要在cookie里保存用户的隐私等重要信息;不要保存太多的cookes,去除不必要的coockie使coockie体积尽量小以减少对用户响应的影响;注意在适应级别的域名上设置coockie以便使子域名不受影响;设置合理的过期时间,较早的Expire时间和不要过早去清除coockie,都会改善用户的响应时间;对静态组件的coockie读取是一种浪费,使用另一个无coockie的域名来存放你的静态组件式一个好方法,或者也可以在coockie中只存放带www的域名。

posted @ 2010-10-31 10:43  1024114660  阅读(284)  评论(0)    收藏  举报