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. 实践中 XunSearch(讯搜)的使用教程步骤

    XunSearch(讯搜)的使用教程步骤 一.安装编译工具 yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql ...

  2. 基于继承的 MethodInterceptor 动态代理(换种写法)

    net.sf.cglib.proxy.Enhancer Generates dynamic subclasses to enable method interception. This class s ...

  3. Java 异常与反射 总结

    1.异常 异常,简单来说,就是一个程序执行过程中发生的不正常情况的事件.它发生在程序的运行期间,干扰了正常的指令流程.如果没有处理异常,那么出现异常之后,程序会停止运行.异常分为运行异常和非运行异常. ...

  4. 利用openxml在Excel中插入图表

    using System.Collections.Generic; using System.Linq; using DOD = DocumentFormat.OpenXml.Drawing; usi ...

  5. 熟悉常用的Linux操作

    请按要求上机实践如下linux基本命令. cd命令:切换目录 (1)切换到目录 /usr/local  cd /usr/local (2)去到目前的上层目录    cd .. (3)回到自己的主文件夹 ...

  6. Educational Codeforces Round 25

    A 题意:给你一个01的字符串,0是个分界点,0把这个字符串分成(0的个数+1)个部分,分别求出这几部分1的个数.例如110011101 输出2031,100输出100,1001输出101 代码: # ...

  7. Python基础理论 - 函数

    函数是第一类对象:可以当做数据来传 1.  可以被引用 2.  可以作为函数参数 3.  可以作为函数返回值 4.  可以作为容器类型的元素 小例子: def func1(): print('func ...

  8. [转] Vmware vs Virtualbox vs KVM vs XEN: virtual machines performance comparison

    http://www.ilsistemista.net/index.php/virtualization/1-virtual-machines-performance-comparison.html? ...

  9. SQL Server AlwaysOn搭建

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/高性能解决方案 概述 环境: 域服务器:windows server 2008 R2 SP1,192.168.2.10 DNS:1 ...

  10. eclipse运行spark程序时日志颜色为黑色的解决办法

    自从开始学习spark计算框架以来,我们老师教的是local模式下用eclipse运行spark程序,然后我在运行spark程序时,发现控制台的日志颜色总是显示为黑色,哇,作为程序猿总有一种强迫症,发 ...