cookie详解

cookie是在客户端存储并跟踪和识别用户的机制。从实现意义上说,cookie是存储在客户端(浏览器)的一小段数据,用过HTTP协议来与服务器端进行cookie交互。
注:客户端不是浏览器,能对cookie进行管理的不止浏览器,当然,咱们最常见的目前还是浏览器。

cookie它是独立于语言存在的,也就是说,不论php还是Java,其本质是一样的,客户端脚本均能读取到(如JavaScript),但从严格意义上来说,cookie并不是由这些语言实现的,甚至可以说,这些语言没有能力执行cookie,他们都是对cookie进行间接操作,即发送HTTP指令,浏览器收到指令操作cookie并返回给服务器。因此,cookie是有浏览器进行操作和管理的。

PHP有两个函数设置cookie,setcookiesetrawcookie
这两个函数功能和参数基本一样,唯一区别就是setrawcookie不会对cookie的value值进行urlencode转码。

cookie的中文译名叫做“甜饼,甜心”,cookie确实能给用户带来很好的体验和方便的功能,但不滥用,它还会增加带宽,一个域下一旦被设置cookie,那么请求这个域的一个资源,服务器和浏览器之间都可能存在cookie的上行和下行流量。

不要把cookie当做浏览器的存储器来用。

cookie保存在客户端的形式有两种,一种是保存在文件中,一种是保存在浏览器的内存中。

正常的情况下cookie只能在一个应用中共享,只能有创建它的应用获得。但为了让用户有更好的体验,就出现了cookie跨域,可以在多个应用中实现共享,即目前最流行的单点登录,最简单的方式便是使用P3P协议。

创建两个域名和三个PHP文件:
www.test1.com/a.php
www.test2.com/b.php
www.test2.com/look.php

a.php代码:

<script src="http://www.test2.com/b.php?uid=1"></script>

b.php代码:

<?php
    header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
    setcookie('uid',$_GET['uid'],time()+3600,'/','.test2.com');
?>

look.php代码:

<?php
    var_dump($_COOKIE);
?>

依次运行:
a.php,look.php,可以看到结果

array(1) { ["uid"]=> string(1) "1" } 

IE浏览器对跨域cookie限制比较严格,火狐,谷歌等浏览器不加P3P协议头也可以发送成功。

一个域名的cookiei限制以4KB键值对的形式存在,一般已经够用,但如果加上服务器端就不一定了,多了一方使用之后这样的数据是不可靠的,永远无法知道是不是自己把它给堵满了,或者别人把你的数据改了。还有一点,在网站发送请求(post)的时候也会把cookie带过去,而这些东西都不需要,就会造成无谓的开销。这些都是使用cookie的顾虑,针对这些弊端,一个新的解决方案为:本地存储localStorage。

可以使用以下代码检查浏览器是否支持localstorage

<script type="text/javascript">
    if (window.localStorage) {
        alert('支持')
    }else{
        alert('不支持')
    }
</script>

存储的方法很简单,就是直接给window.localStorage添加一个属性,例:

<script type="text/javascript">
    window.localStorage.a = 111;
    console.log(localStorage.a);    //设置a的值

    window.localStorage["b"] = 222;
    console.log(localStorage.b);    //设置b的值

    window.localStorage.setItem("c",'3333');    //设置c的值
    console.log(localStorage.c);

    console.log(localStorage.getItem("b"));     //获取b的值

    localStorage.removeItem("c")        //清除c的值
    console.log(localStorage.getItem("c"));

</script>

控制台打印结果

111

222

3333

222

null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值