Cookie的基本概念和设置

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

     注意 这里说的是客户端而不是浏览器,实际能管理Cookie的不仅仅是浏览器,当然最常见的是由浏览器管理Cookie,后面的叙述中不再区分这两个概念。
      Cookie独立语言存在,也就是说,不论PHP还是JSP种下的Cookie,其本质都是一样的,客户端脚本(如JavaScript)均能读取到。Cookie并不是由这些语言实现,而这些语言则是实现对Cookie的间接操作,聚聚发送HTTP指令,浏览器收到指令便操作Cookie返回给服务器。因此,Cookie是由于浏览器实现和管理的。关于Cookie的RFC文档主要有:RFC6265、RFC2109。
     举例来说,我们经常使用PHP设置Cookie,但实际上PHP并没有真正设置过Cookie,甚至可以说,PHP根本就没有这个能力设置Cookie。它只是发出命令让浏览器来做这件事而已,形象地说就和“有关部门”打个招呼。了解这个概念,对于后面的学习很重要。
     Cookie主要是参照RFC2109标准实现和客户端之间的交互指令。
     在PHP中可以使用setcookie()或setrawcookie()函数设置Cookie。其函数原型如下:
bool 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值,而应该用于0表示false,用1表示true,用1表示true。只要愿意,用A表示false, B表示true也是可以的。
第三个用来设置有效时间,以秒为单位。这个值很重要,决定了Cookie的存储方式。
第四个参数用来设置Cookie的有效目录,默认为“/”,即整个域名下有效,如果有需要,可能设置仅在某目录下有效。
第五个参数用来设置Cookie的作用域名,默认域名下。需要注意的是,在IE下,包括点号长度小于等于5的短域名如果带domain参数,会导致Cookie设置失败。
第六个参数用于设置是否对Cookie进行加密传输,默认为false。如果设置true,只有使用HTTPS,这个Cookie才会被设置。所以,通常情况下不设置此参数或使用默认值false。
第七个参数表示是否只使用HTTP访问Cookie。如果1为1或者true,客户端的JavaScript就无法操作这个Cookie。使用此参数可以减少XSS攻击的风险,但注意,不是所有的浏览器都支持这个参数。此参数只在PHP5.2.0以上版本有效。(再次强调,Cookie和PHP没有任何关系,具体的管理由客户端全程完成。)
提示 setrawcookie的功能和参数与setcookie基本一样,唯一区别是setraw-cookie不会对Cookie中的value进行urlencode转码。
设置Cookie时需要注意以下几点:
这个函数一个返回值,如果是false,代表设置失败;如果true,代表设置成功。但是这个返回值仅供参考,不代表客户端一定能接收到。
由于PHP在当前页设置的Cookie不能立即生效,要等到下一个页面才能看到。这是由于设置的这个页面里的Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器。如果是JavaScript设置的,是立即生效的。
Cookie没有显式的删除函数。如果想删除Cookie,应该将Cookie的expire设置为过期时间,如1小时前、1970年等,这会自动触发浏览器的删除机制。
 
 
Cookie跨域与P3P协议
      正常的Cookie只能在一个应用中共享,即一个Cookie只能由创建它的应用获得。实现Cookie跨域,主要是为了统一应用平台,即实现目前最流行的单点登录。最简单的方式就是使用P3P协议。
      P3P(Platform for Privacy Preferences)协议由万维网协议研制,为Web用户提供了对自己公开信息的更多控制。支持P3P协议的Web站点为浏览者声明它们的隐私策略。支持P3P协议的浏览器将Web站点策略与用户隐私偏好进行对比,并为用户提出不匹配的警告,通知用户有关Web隐私的处理方式。
 
Cookie跨域涉及两个不同的应用,习惯上称为第一方和第三方。
      第一方Cookie来自当前正在查看的网站,或者发送到当前正在查看的网站。
      第三方Cookie来自当前正在查看的网站以外的网站,或者发送到当前正在查看的网站以外的网站。
      第三方网站通常提供正在查看的网站上的内容。例如,许多站点使用来自第三方网站的广告,或者IFAME的别的网站的URL,这些第三方的网站可能使用的Cookie.
      通过P3P使用户自己可以指定浏览器的隐私策略,达到存取第三方Cookie的目的。也许你觉得这跟web应用 毫无关系,真正的问题是如何让服务器指定用户浏览器的隐私策略,这就是P3P的使命,只要在响应用户请求时,在HTTP的头信息中增加相关于P3P的配置信息就可以了,
 

Cookie提要的更多相关文章

  1. Http协议提要

    HTTP协议提要 简单来说,HTTP就是一个基于应用层的通信规范:双方要进行通信,大家就要遵守一个规范---HTTP协议.HTTP协议从WWW服务器超文本到本地浏览器 ,可以使浏览器更加高效.HTTP ...

  2. 超大 Cookie 拒绝服务攻击

    有没有想过,如果网站的 Cookie 特别多特别大,会发生什么情况? 不多说,马上来试验一下: for (i = 0; i < 20; i++) document.cookie = i + '= ...

  3. IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题

    你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的,唯独到了IE10.11这些高版本浏览器就不行了?好吧,这个问题码农连续2天内遇到了2次.那么,我们 ...

  4. 解决cookie跨域访问

    一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入c ...

  5. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  6. 一个诡异的COOKIE问题

    今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...

  7. [转载]Cookie/Session的机制与安全

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  8. jquery.cookie的使用

    今天想到了要为自己的影像日记增加赞的功能,并且需要用到cookie. 记得原生的js操作cookie也不是很麻烦的,但似乎jquery更简单,不过相比原生js,需要额外引入2个文件,似乎又不是很好,但 ...

  9. 跨域问题,前端主动向后台发送cookie

    跨域是什么? 从一个域名的网页访问另一个域名的资源,就会出现跨域.只要协议.端口.域名有一个不同就会出现跨域 例如: 1.协议不同  http://www.baidu.com:80 和 https:/ ...

随机推荐

  1. js怎么把数字转化为字母(A,B.....AA,AB,..)

    function createCellPos( n ){ var ordA = 'A'.charCodeAt(0); var ordZ = 'Z'.charCodeAt(0); var len = o ...

  2. U盘安装centos7 关键步骤

    出现安装界面 按tab键或e键进行修改 一般默认第二行为: vmlinuz intrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd ...

  3. expdp错误案例

    转自:https://www.cnblogs.com/kerrycode/p/3960328.html Oracle数据泵(Data Dump)使用过程当中经常会遇到一些奇奇怪怪的错误案例,下面总结一 ...

  4. 在windows下golang安装zmq3小记

    备忘这个 安装 TDM-GCChttp://tdm-gcc.tdragon.net/download 设置环境变量set C_INCLUDE_PATH=d:\DevTools\Zmq\ZeroMQ 3 ...

  5. virtualenv搭建

    1.准备工作 终端 网络状况良好 2.安装虚拟环境 ​ 如何安装虚拟环境: ​ 2.1了解你的电脑中有哪些版本的python whereis python 查看当前系统中有多少跟python有关的命令 ...

  6. [Solution] JZOJ-5818 做运动

    [Solution] JZOJ-5818 做运动 Time Limits:2000ms Memory Limits:524288KB Description 一天,Y 君在测量体重的时候惊讶的发现,由 ...

  7. C#框架类

    C# 开源框架(整理) Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用J ...

  8. 记一个centos分区大小调整过程

    1. 备份 /home 目录 [root@centos ~]# cp -r /home /home_backup 2. 查看目前磁盘使用的情况, 需要将 /dev/mapper/centos-home ...

  9. Web browser的发展史

        浏览器是个显示网页伺服器或档案系统内的HTML文件,并让用户与此些文件互动的一种软件.个人电脑上常见的网页浏览器包括微软的Internet Explorer.Moailla的Firefox.O ...

  10. 协程 及 libco 介绍

    libco 是腾讯开源的一个协程库,主要应用于微信后台RPC框架,下面我们从为什么使用协程.如何实现协程.libco使用等方面了解协程和libco. why协程 为什么使用协程,我们先从server框 ...