关于 Cookie 技术

摘要:由于 Http 协议的请求过程,是基于 TCP/IP 的,当客户端请求服务器,服务器处理后,进行响应,这个过程是无状态的。在有些时候,是需要保存一些客户端的请求信息,识别客户端的某些状态,智能的、有针对性的去分析某些客户端的习惯。这些时候,就需要去记录客户端的连接状态,识别请求的状态等。为了解决类似的事情,就需要使用到了 Cookie。

引言

由于 Http 协议的请求过程,是基于 TCP/IP 的,当客户端请求服务器,服务器处理后,进行响应,这个过程是无状态的。
在有些时候,是需要保存一些客户端的请求信息,识别客户端的某些状态,智能的、有针对性的去分析某些客户端的习惯。
这些时候,就需要去记录客户端的连接状态,识别请求的状态等。为了解决类似的事情,就需要使用到了 Cookie。

Cookie 基础知识

Cookie 机制

HTTP协议是一种无状态、无连接的协议,不能在服务器上保持一次会话的连续状态信息。随着WWW的不断发展,HTTP的无状态性不能满足某些应用的需求,
给Web服务器和客户端的操作带来种种不便。在此背景下,提出HTTP的状态管理机制——Cookie机制,它是对HTTP协议的一种补充,以保持服务器和客户端的连续状态。

Cookie在远程浏览器端存储数据并以此跟踪和识别用户的机制。从实现上说,Cookie是存储在客户端上的一小段数据,浏览器(即客户端)通过HTTP协议和服务器端进行Cookie交互。

Cookie 技术

Cookie是一种能够让网站Web服务器把少量数据储存到客户端的硬盘或内存里,或是从客户端的硬盘里读取数据的一种技术。
所谓Cookie技术,是在浏览器端保存数据的一门技术,是浏览器的技术。也就是说将需要在一定会话周期内保存的数据,
记录在浏览器端,浏览器在每次请求服务器时,将所保存的会话数据携带到服务器端。

PHP在Cookie技术中,承担的角色是负责决定在何时存入什么数据,并在浏览器携带Cookie数据请求服务器时,
可以得到所携带的Cookie数据。(PHP支持Cookie技术)

Cookie 文件

Cookie文件是指在浏览某个网站时,由Web服务器的CGI脚本创建的存储在浏览器客户端计算机上的一个小文本文件,
其格式为:

用户名@网站地址 [数字].txt。

Cookie文件记录了用户的有关信息,如身份识别号码ID、密码、浏览过的网页、停留的时间、用户在Web站点购物的方式或用户访问该站点的次数等,
当用户再次链接Web服务器时,浏览器读取Cookie信息并传递给Web站点。

Cookie文件信息片断以“名/值”对(name-vaiuepairs)的形式储存,一个“名/值”对仅仅是一条命名的数据。

Cookie 功能

Cookie 的作用是为了解决HTTP协议无状态的缺陷。其主要功能是实现用户个人信息的记录,最根本的用途是帮助Web站点保存有关访问者的信息。
更概括地说,Cookie是一种保持Web应用程序连续性(即执行状态管理)的方法。

Cookie 工作原理

Cookie使用HTTPHeader传递数据。

Cookie机制定义了两种报头:Set-Cookie报头和Cookie报头。

Set-Cookie报头包含于Web服务器的响应头(ResponseHeader)中。

Cookie报头包含在浏览器客户端请求头(RequestHeader)中。

Cookie的运行过程:

  • 客户端在浏览器的地址栏中键入Web服务器的URL,浏览器发送读取网页的请求。
  • 服务器接收到请求后,产生一个Set-Cookie报头,放在HTTP报文中一起回传客户端,发起一次会话。
  • 客户端收到应答后,若要继续该次会话,则将Set-Cookie中的内容取出,形成一个Cookie.txt文件储存在客户端计算机里。
  • 当客户端再次向服务器发出请求时,浏览器先在电脑里寻找对应该网站的Cookie.txt文件。如果找到,则根据此Cookie.txt产生Cookie报头,
    放在HTTP请求报文中发给服务器。
  • 服务器接收到包含Cookie报头的请求,检索其Cookie中与用户有关的信息,生成一个客户端所请示的页面应答传递给客户端。 浏览器的每
    一次网页请求,都可以传递已存在的Cookie文件,例如,浏览器的打开或刷新网页操作。

Cookie 信息属性

Cookie中保存的信息都是文本信息,在客户端和服务器端交互过程中,由键/值对组成 Cookie 信息被附加在HTTP消息头中传递。下面是一个 HTTP 头中 Cookie 的例子:

Set-Cookie: key = value; Path=/

Cookie中存放的信息包含Cookie本身属性和用户自定义属性,一个Cookie只能包含一个自定义键/值对。

Cookie本身属性有“Comment”、“Domain”、“Max-Age”、“Path”、“Secure”、“Version”。具体属性的作用如下:

属性 作用 备注
Comment 对产生该Cookie的描述
Domain 可访问该Cookie的域名 对一些大的网站,如果希望Cookie可以在子网站中共享,可以使用该属性
Max-Age 定义Cookie的有效时间 用秒计数,当超过有效期后,Cookie的信息不会从客户端附加在HTTP消息头中发送到服务端
Path 访问Cookie页面的路径 缺省状态下Path为产生Cookie时的路径,此时Cookie可以被该路径以及其子路径下的页面访问
Secure 定义Cookie的安全性 Secure为false时则可在HTTP状态下传递Cookie,Secure缺省为false
Version 定义Cookie的版本 由Cookie的创建者定义

注:当Secure值为true时必须是HTTPS状态下Cookie才从客户端附加在HTTP消息中发送到服务端,在HTTP时Cookie是不发送的。

Cookie 基本操作

对于 Cookie 的常用操作有存取,读取,以及设置有效期。
Cookie客户端操作具体可以参照 JavaScript 操作 Cookie 一文;
在前端编码方面,皆以Vue为冲锋利器,所以有一款插件 vue-cookie,其代码仅30行,堪称精妙。

Cookie 创建

Cookie 可以在服务器端创建,然后将 Cookie 信息附加在HTTP消息头中传到客户端,如果指定生存有效时间就会保存在客户端本地磁盘。
保存 Cookie 文件是一个文本文件,因此不用担心此文件中的内容会被执行而破坏客户的机器。

支持Web端开发的语言都有创建 Cookie 的方法或函数,以及设置 Cookie 属性和添加自定义属性的方法或函数,最终将 Cookie 附加到返回客户端的HTTP消息头中。

在PHP语言中,可利用PHP的内置函数,setCookie()完成。

setCookie (变量名,变量值,过期时间,有效的服务器路径,有效域名/子域名,是否通过 HTTPS 安全连接,是否通过 HTTP 协议访问)

例:创建名为 "user" 的 Cookie,并为它赋值 "Alan Outlier",规定了此 cookie 在一小时后过期

setcookie("user", "Alan Outlier", time()+3600);

注:在发送 Cookie 时,Cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,使用 setrawcookie() 代替。)
创建 Cookie 时如果不指定生存有效时间,则Cookie 只在浏览器关闭前有效,Cookie 会在服务器端和客户端传输,但是不会保存在客户机的磁盘上,打开新的浏览器将不能获得原先创建的 Cookie 信息。

因为Cookie是通过HTTP标头进行设置的,所以也可以直接使用header方法进行设置。

header("Set-Cookie:cookie_name=value");

Cookie 信息保存在本地时会保存到当前登录用户专门目录下,保存的 Cookie 文件名中会包含创建 Cookie 所在页面网站的域名,当浏览器再次连接该网站时,会从本机 Cookie 存放目录下选出该网站的有效Cookie,将保存在其中的信息附加在HTTP消息头中发送到服务器端,服务器端程序就可根据上次保存在Cookie的信息为访问客户提供“记忆”或个性化服务。

Cookie除了可以在服务器端创建外,也可以在客户端的浏览器中用客户端脚本(如JavaScript)创建。
客户端创建的 Cookie 的性质和服务器端创建的 Cookie 一样,可以保存在本地,也可以被传送到服务器端被服务器程序读取。

Cookie 获取

利用PHP的预定义超全局数组变量 $_COOKIE 完成。每个元素就是一个浏览器请求时携带的 COOKIE 变量。下标为 COOKIE 变量名,值为 COOKIE 变量值。

if(isset($_COOKIE["user"]))
echo"Welcome".$_COOKIE["user"]."!<br>";
else
echo"Welcomeguest!<br>";

Cookie 删除

利用有效期删除 COOKIE 变量。

setcookie("user","",time()-3600);

第三个参数的默认值为0,表示浏览器关闭才失效。

Cookie 操作详解

Cookie 变量名允许下标的形式

通过利用setcookie的第一个参数进行标识名称中指定数组下标的形式设置。

setcookie("user[username]","wangxiong");
setcookie("user[password]","*****");
setcookie("user[email]","lensxiong@gmail.com");

在设置成功之后形成 $_COOKIE数组元素时,PHP程序将其整理成一个数组结构,如果需要在PHP脚本中获取其值则需要使用$_COOKIE超全局数组。
直接打印$_COOKIE['user']数组示例:

print_r($_COOKIE['user']); // Array ( [username] => wangxiong [password] => ***** [email] => lensxiong@gmil.com )

通过遍历 $_COOKIE['user']数组示例:

foreach($_COOKIE["user"] as $key=>$value){
    //输出cookie数组中的二维键值对
    echo $key . ":" .$value,"\n";    // username:wangxiong password:***** email:lensxiong@gmil.com
}

COOKIE 变量的有效期

通过利用 setcookie的第三个参数进行设置。

默认的有效期(第三个参数的值为0),表示浏览器关闭会话周期结束:

setcookie("user[username]","wangxiong", 0);

PHP 会在响应数据中,将 COOKIE 的失效时间告知给浏览器。
浏览器去检测 COOKIE 变量的有效期,如果过期,就不会在请求时携带(在浏览器端删除该 COOKIE 变量)。
当到达某个时间点时,此 COOKIE 变量会自动失效。

通过PHP_INT_MAX设置 COOKIE 永久有效如下:

setcookie("user[username]","wangxiong", PHP_INT_MAX)

COOKIE 变量的有效路径

通过利用 setcookie 的第四个参数进行设置。

设置变量的有效路径为站点根目录如下:

setcookie('name', 'wangxiong', 0 , '/');

设置成 / 时,Cookie 对整个域名 domain 有效。 如果设置成 /foo/, Cookie 仅仅对 domain 中 /foo/目录及其子目录有效(比如 /foo/bar/)。
默认值是设置 Cookie 时的当前目录。

COOKIE 变量的有效域名

通过利用 setcookie的第五个参数进行设置。

设置所有的 wangxiong.me都有效示例如下:

setcookie('name', 'wangxiong', 0 , '/', 'wangxiong.me');

设置成子域名(例如 www.example.com),会使 Cookie 对这个子域名和它的三级域名有效(例如 w2.www.example.com)。

要让 Cookie 对整个域名有效(包括它的全部子域名),只要设置成域名就可以了(这个例子里是 example.com)。

Cookie 应用场景

实现Web中的用户认证

HTTP协议一个很大的缺点就是不作用户身份的判断,这给编程人员带来很大的不便,而 Cookie 弥补了这个缺陷。大多数站点在进行用户身份认
证时都采用 Cookie 机制,使用户在通过第一次身份认证以后,无需再多次输入其用户帐号、口令密码等,这样能省去用户登录的繁琐。

定制个性化空间

Cookie 技术方便 Web 站点为不同用户订制信息,给用户提供个性化、更友好的浏览环境,并能更加准确地收集访问者的信息。例如,为用户
提供改变网页内容、布局和颜色的权力,允许用户输入自己的信息,然后通过这些信息对网站的一些参数进行修改,以订制网页的外观。

另外,由于费用、带宽限制等原因,用户访问一个站点时并不希望浏览网页所有的内容。利用 Cookie 技术根据个人喜好设定栏目,动态地产生
用户所需要的内容,这样能够迎合不同层次用户的访问兴趣,减少用户项目选择的次数,更加合理地利用Web服务器的传输带宽。

网站访问统计

由于代理服务器、缓存等的使用,使得能帮助网站精确统计来访人数的方法只能是为每个访问者建立一个唯一的 ID 。使用 Cookie ,网站可以
完成以下工作:测定多少人访问过;测定访问者中有多少是新用户、多少是老用户;测定一个用户多久访问一次网站。

基本方法是:借助于后台数据库,在用户第一次访问该网站时,网站在数据库中建立一个新的ID,并把ID通过Cookie传送给用户。用户再次
来访时,网站把该用户ID对应的计数器加1,得到用户的来访次数或判断用户是新用户还是老用户。

维护在线电子商务客户信息

在线订购商务中使用 Cookie 技术,可记载用户想购买的物品。用户往“购物车”里投放商品,网站便在数据库中用户的ID记录里记录下来。
当用户“买单”时,网站通过 ID 检索数据库中用户的所有选择就知道“购物车”里的物品项目。 Cookie 能简化订购中的操作,使网上购物更接近现实生活。

记录站点轨迹

再次访问同一网站时 Cookie 具有被读回的特性。利用这一特性来实现很多的设计功能,如显示用户访问该网页的次数;
显示用户上一次的访问时间;记录用户以前在本页中所做的选择等,这可以免去研究复杂的 CGI 编程。

参考文章

维基百科 HTTP cookie

深入解析Cookie技术

详解 Cookie 纪要

相关推荐

微信扫一扫,分享到朋友圈

关于 Cookie 技术
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close