cookie是在客户端存储并跟踪和识别用户的机制。从实现意义上说,cookie是存储在客户端(浏览器)的一小段数据,用过HTTP协议来与服务器端进行cookie交互。
注:客户端不是浏览器,能对cookie进行管理的不止浏览器,当然,咱们最常见的目前还是浏览器。
cookie它是独立于语言存在的,也就是说,不论php还是Java,其本质是一样的,客户端脚本均能读取到(如JavaScript),但从严格意义上来说,cookie并不是由这些语言实现的,甚至可以说,这些语言没有能力执行cookie,他们都是对cookie进行间接操作,即发送HTTP指令,浏览器收到指令操作cookie并返回给服务器。因此,cookie是有浏览器进行操作和管理的。
PHP有两个函数设置cookie,setcookie和setrawcookie。
这两个函数功能和参数基本一样,唯一区别就是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