|
为什么会有Cookies机制呢,或者说,为什么需要它?它的使用场景是什么?那就是:
由于在写服务端代码时,经常需要在个代码文件之间传递数据,如果通过require引入文件或get、post提交请求的方式来传值都非常麻烦,所以就有了cookies机制,它的原理如下。
- 1、客户端请求服务器,服务器使用setcookie或header命令设置一个键值对,通过响应头返回给客户端,客户端收到后会自动保存下来。
- 2、以后,客户端的每次请求都会自动在请求头里面带上这个键值对。
- 3、这样服务器的任意页面只要获取请求头里面的这个键值对就可以得到这个键值对。
复制代码
服务器设置Cookie的方法如下:
- header('name:tom');
- 或
- setcookie('name','lisi');
复制代码 服务器获取Cookie的方法如下:
默认状态下,关闭浏览器后,cookies自动消失,所以称为临时cookie。如需关闭浏览器后cookies不消失,需填写setcookie的第2个参数,如下:
- $time=time()+3600;//有效期一小时
- setcookie('name','lisi',$time);
- setcookie('age',18,$time);
- setcookie("sex","男",$time);
复制代码 当客户端请求以上代码所在的php文件时,服务器会把Cookies信息通过响应头返回给浏览器,如下:
无论如何,cookie信息都不可以在不同的浏览器中共享。
默认状态下,cookies设置好以后,服务器中只能在当前目录和子目录下获取,如果需要整站有效需设置setcookie的第四个参数为/,如下:
- $time=time()+3600;//有效期一小时
- setcookie('name','lisi',$time,'/');
- setcookie('age',18,$time,'/');
- setcookie("sex","男",$time,'/');
复制代码 执行后浏览器会得到如下的结果:
默认状态下,cookies设置好以后,不支持子域名共享,我们来测试一下,跨域访问的情况,如下:
如需子域名共享,需设置setcookie的第五个参数,如下:
- $time=time()+3600;//有效期一小时
- setcookie('name','lisi',$time,'/','php.zhao');
- setcookie('age',18,$time,'/','php.zhao');
- setcookie("sex","男",$time,'/','php.zhao');
复制代码
设置后再进行跨域访问,已可以访问,如下:
默认状态下,不开启安全访问,如需仅https访问需设置第6个参数为true,设置后http将不能访问。设置代码如下:
- $time=time()+3600;//有效期一小时
- setcookie('name','lisi',$time,'/','php.zhao',true);
- setcookie('age',18,$time,'/','php.zhao');
- setcookie("sex","男",$time,'/','php.zhao');
复制代码 设置后,浏览器中响应头信息如下:
访问效果如下:
默认状态下,PHP和JS都可以访问,我们来测试服务器使用如下代码获取Cookie:
- echo $_COOKIE['name']."<br>";
- echo $_COOKIE['age']."<br>";
- echo $_COOKIE['sex']."<br>";
- ?>
- <script>
- document.write(document.cookie);//JS获取cookie
- </script>
复制代码
效果如下:
如需仅服务器访问,需设置第7个参数为true。代码如下:
- $time=time()+3600;//有效期一小时
- setcookie('name','lisi',$time,'/','php.zhao',false,true);
- setcookie('age',18,$time,'/','php.zhao');
- setcookie("sex","男",$time,'/','php.zhao');
复制代码 访问效果如下:
PHP并未提供删除cookie的方法,我们可以通过给键值名赋值false的方式删除cookie,也可以通过设置一个已过去的时间删除cookie。
注意:cookie仅可以存放字符串和数字。
cookie机制存在以下的缺点
1、因为在浏览器中可以看到cookie 的值,所以安全性低
2、因为只能保存字符串和数字,所以可控性差
3、因为数据放在请求头中传输,增加了请求时候的数据负载。
4、因为数据存储在浏览器中,但浏览器存储空间是有极限的,一般是4K。
所以又产生了一种新的机制,那就是session,我们下次接着再讲。
|
|