Cookie

本文深入解析了Cookie的工作原理,包括其在客户端的存储机制、HTTP协议交互、设置与管理方法,以及跨域问题与P3P协议的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Cookie是在远程浏览器端存储数据并以此跟踪和识别用户的机制。
 Cookie是存储在客户端上的一小段数据,浏览器(即客户端)通过HTTP协议和服务器端进行Cookie交互。(客户端不止单单的浏览器)
 Cookie 独立于语言存在,这些语言是实现对 Cookie的间接操作,即发送HTTP指令,浏览器收到指令便操作 Cookie并返回给服务器。因 此 Cookie是由浏览器实现和管理的。关于 Cookie的RFC文档主要有:RFC 6265、RFC 2109。
 Cookie主要是参照RFC 2109标准由客户端实现其生成、使用等整个管理过程,服务器端则参照此标准实现和客户端之间的交互指令。
 
PHP中可以使用setcookie()或setrawcookie()函数设置Cookie。

 setcookie(string $name[,string $value[,int $expire = 0 [,string $path [,string $domain [,bool $secure = false [,bool $httponly = false]]]]]]) 
 第一个参数是必选参数,其值是Cookie的名称,即$_COOKIE这个全局数组的键值。
 第二个参数用来设置Cookie的值。参数为空时,Cookie值为空。由于把Cookie的值设为false会使客户端尝试删除这个Cookie,所以要在 Cookie中保存true或false时不应该直接使用boolean值,而应该用标量来代表ture或false。 
 第三个参数用来设置有效时间,单位是秒。Cookie没有删除函数,如果需要删除讲时间设置为过期时间。如1小时前等
 第四个参数用来设置Cookie的有效目录,默认为“/”,即整个域名下有效。如果有需要,可以设置仅在某目录下有效。
 第五个参数用来设置Cookie的作用域名,默认在本域名下。 需要注意的是,在IE下,包括点号长度小于等于5的短域名如果带有domain参  数,会导致Cookie设置失败。
 第六个参数用来设置是否对Cookie进行加密传输,默认为false。如果设置为true,只有使用HTTPS,这个Cookie才会被设置。所以,通常情况下不设置此参数或使用默认值false。
 第七个参数表示是否只使用HTTP访问Cookie。如果为1或者true,客户端的Javascript就无法操作这个Cookie。但注意,不是所有的浏览器都支持这个参数。此参数只在php5.2.0以上版本有效。

setrawcookie()的功能和参数与setcookie()基本一样,唯一区别是setrawcookie()不会对Cookie中的value进行urlencode转码。 

设置Cookie市需要注意一下几点:
1.这两个函数有一个返回值,false/ture。但是这个返回值仅供参考,不代表客户端一定能接受到。
2. 由PHP在当前页面设置的Cookie不能立即生效,要等到下一个页面才能看到。这是由于设置的这个页面里的Cookie由服务器传递给客户端浏览器,在 下一个页面浏览器才能把cookie从客户的机器里面取出传回服务器。如果是Javascript设置的,是立即生效。
3.Cookie是 HTTP头的一部分,即先发送或请求Cookie,然后才是data域。因此setcookie()等函数必须在其输出数据之前调用,这和 header()函数是相同的。(可以借助header发送HTTP指令设置Cookie,但一般不推荐这样做。header("Set- Cookie:name = $value[;path = $path...]"))

Cookie存储
每个域名下允许的 Cookie 是有限制的,根据浏览器这个限制也不同。例如IE8一个域名可以存放50个Cookie,Firefox一个域名可以存150个(数目不是固定的,而且是 可以修改的),超过后就删除旧的,且一个Cookie最大字节数为4097(随着浏览器的更新换代,这个上限可能会增加)。
不要把Cookie当做客户端的存储来使用。Cookie 是保存在客户端的一段数据,设置了时间但没过期的Cookie 会保存在文件中,没有设置过期时间的会随着浏览器的关闭而消失,即保存在内存中。

Cookie跨域与P3P协议
正常的Cookie只能在一个应用中共享,即一个Cookie只能有创建它的应用获得。实现Cookie的跨域,主要是为了统一应用平台,即实现单点登录。Cookie 跨域涉及两个不同的应用,习惯上称为第一方和第三方。
第一方Cookie 来自当前正在查看的网站,或者发送到当前正在查看的网站。
第三方Cookie 来自当前正在查看的网站以外的网站,或者发送到当前正在查看的网站以外的网站。
通过P3P是用户自己可以指定浏览器的隐私策略,达到存取第三方Cookie 的目的。
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA div COM NAV OTC NOI DSP COR"');  
相关注意事项总结:
1.页面的Cookie不能使浏览器进程的Cookie(如不设置超时时间的Cookie),否则跨域会取不到。
2.利用IFRAME时,记得要在相应的动态页的页头添加一下P3P的信息,否则IE会把IFRAME框里的Cookie给阻止掉,产生问题本身未保存,自然就取不到。使用FRAME或者IFRAME时都会遇到。
3.IE对跨域访问Cookie限制比较严格,在Firefox、Chrome等浏览器下测试,即使不发送P3P头信息也能成功。

转载于:https://www.cnblogs.com/liuxl/p/3780803.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值