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. Linux下安装numpy

    转自:https://blog.csdn.net/abc_321a/article/details/82056019 1.下载源码包 ,命令如下 wget http://jaist.dl.source ...

  2. springmvc 整合Controller出现实例化两次问题

    启动项目的时候,发现初始化控制层的时候,初始化(使用构造方法打印日志的方式)了两次的情况. 后来检查配置: <context:component-scan base-package=" ...

  3. 正则表达式校验yyyymmdd

    正则表达式为 ([\\d]{4}(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9] ...

  4. 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算

    1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...

  5. ssh 使用 sed 替换的时候,替换的字符串有单双引号的时候怎么用

    线上有一个脚本需要 ssh 登录远程机,然后完成特定文件中的某个值,替换的字符中有单引号,所以需要特定的写法,才能成功 1).ssh 远程执行命令,替换字符串中有单引号( ' ) ssh zhuzi@ ...

  6. 安装Kali的小问题

    安装时候的问题 1.安装时程序步骤不正确 在安装kali时,参照视频教程(https://www.mosoteach.cn/web/index.php?c=res&m=index&cl ...

  7. 自动的输入号码的辅助软件在ie浏览器下的尝试

    在ie下面的自动输入号码的软件,我已经折腾了好久.由于ie环境非常复杂:网页延迟这个时间一直不能准确的得到,这个时间主要包括:网络的与服务器的交换速度,网页自身的加载速度,网页的js渲染的效果的影响. ...

  8. es6的几种写法

    语法:1.只有一个参数,可以不用写小括号: var single = a => a; //相当于var single = function(a){return a;}console.log(si ...

  9. Linux下安装GEOS环境

    1.下载对应版本的geos源码:http://download.osgeo.org/geos/ 2.下载后使用cd切换到源码目录解压:tar -xvf geosXXX.tar.gz 3.切换到解压后目 ...

  10. linux系统下安装redis以及java调用redis

    关系型数据库:MySQL  Oracle 非关系型数据库:Redis 去掉主外键等关系数据库的关系性特性 1)安装redis编译的c环境,yum install gcc-c++ 2)将redis-2. ...