Cookie详解

一、绪论

Cookie在远程浏览器端存储数据并以此跟踪和识别用户的机制。

Cookie是存在客户端上的一小段数据,客户端通过http协议和服务器端进行Cookie交互。

Cookie独立于语言存在(属于客户端浏览器,不属于哪一门具体语言),严格来说,Cookie并不是由PHP、JSP等语言实现的,而是由这些语言对Cookie进行间接操作(即发送HTTP指令,SET-Cookie 消息报头),客户端收到指令便操作Cookie并返回给服务器。因此,Cookie由客户端(浏览器)实现和管理。关于Cookie的RFC文档主要有:RFC 6265、RFC 2109。

在PHP中可以使用 setcookie() 或 setrawcookie() 函数设置 Cookie。这两个函数的唯一区别是,setrawcookie不会对Cookie中的value进行 urlencode 转码。

设置Cookie时需要注意:

1、这两个函数有返回值

2、由PHP在当前页设置的Cookie不能立即生效,要等到下一个页面才能看到。因为设置的这个页面里的Cookie由服务器传递给客户端浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器。如果是JS设置的,则立即生效。

3、Cookie没有显示的删除函数。如果想删除Cookie,应该将Cookie的expire设置为过期时间。

4、Cookie是HTTP头的一部分,即先发送或请求Cookie,然后才是data域。因此setCookie()等函数必须在其输出数据之前调用,和header()函数是相同的。不过可以使用输出缓存函数延迟脚本的输出,直到设置好所有的Cookie和其他HTTP标头。

Cookie通常用来存储一些不敏感的信息,或者进行登录控制,也可用来记住用户名、记住免密码登录、防止刷票等。

每个域名下允许的Cookie是有限制的,根据浏览器的不同有不同的限制个数,超过后就删除旧的,且一个Cookie最大字节数为4097(随浏览器版本更新可能变化)

注意不要把Cookie当做客户端的存储器使用。

Cookie是保存在客户端的,一种是文件中,还有是保存在浏览器内存中。因此,关闭浏览器,Cookie并不会随之消失,除非设置该Cookie的expire为空,即随浏览器关闭而消失(即保存在浏览器内存中)。还有一种Cookie由flash创建,即使清空浏览器所有隐私数据,这类顽固的Cookie还会存在硬盘上。它们不受浏览器管理,只受flash管理。

二、Cookie跨域

正常的Cookie只能由创建它的应用获得。Cookie的跨域主要是为了统一应用平台,实现单点登录。最简单的方式是使用 P3P 协议。

所谓跨域,字面上就是分属于不同的域名,但实际上的跨域范畴不仅仅是如此。

跨域指的是超过了浏览器的同源策略。

所谓通源指的是“三个相同”:

1、协议相同

2、域名相同

3、端口相同

目前,如果非同源共有三种行为会受到限制:

1、Cookie、LocalStorage和IndexDB无法读取

2、DOM无法获得

3、AJAX请求不能发送

如果存在跨域,就需要用 P3P 或 CORS 方案来处理。

原文地址:https://www.cnblogs.com/cshaptx4869/p/10465900.html