您的位置:首页 > 编程语言 > PHP开发

Cookie for PHP

2016-07-25 22:03 369 查看
首先为什么要引入Cookie呢,因为B/S架构(浏览器/服务器)架构是居于HTTP协议,其特点是无状态的(即最简单的请求–响应模式(也就是我向你请求数据而你给我返回数据)),但是他不能存储数据(请求完就完了,我不记得我向你请求过什么,也不知道你回答了 我什么),即无状态的协议。

那么为何

不能存储到变量中:不行,变量脚本周期结束时,被自动销毁。

不能存储到常量中:不行,常量脚本周期结束时,被自动销毁。

不能存储到数据库:不行,存储在数据库,脚本周期结束,不会被销毁。不能区分是哪台浏览器的的登陆成功,不能区分该凭证属于哪台浏览器。

SO 我们引进了会话技术

会话技术:即在同一台浏览器对某台服务器的多次请求周期内,用来持续性存储数据的一种技术。称之为会话技术

简单点来说就是能够存储你想要存储的数据 ,并且满足其特点

1. 区分浏览器。

2. 多次请求数据不会丢失即可

以下我们来说说会话技术–Cookie技术

基本介绍:

Cookie是将会话数据,存储在浏览器端的一种技术。其特点是:

之一:服务器负责存储数据到浏览器端。

其二:浏览器在每次请求时,将记录下来的数据,携带到服务器端

图如下:



值得注意的是,是服务器端设定让其浏览器存储数据的,而浏览器每次请求时只是将记录下的值带在请求头里,携带到服务器。

(但值得注意的是,你现在用浏览器时,每次输入表单,浏览器都会询问你是否保存密码,这只是浏览器做的一种优化功能,将你的用户名密码存储下来,方便下次使用。有时候并不是服务器端设定的)。

PHP中Cookie的基本使用

设置Cookie的值

函数

Setcookie(KEY, VALUE)

Setcookie(‘name’, ‘kang’);

设置时,该设置指令,是在服务器向浏览器响应阶段,将(指令)数据传输到浏览器端。

通过 firebug的网络面板,进行观察:



此时,浏览器接受到该指令,则完成记录COOKIE数据。

获取Cookie数据

_COOKIE超全局数组变量。在服务器接收到浏览器的请求时,PHP核心程序,会将接收到的所有的COOKIE数据,整理到_COOKIE这数组中。

$_COOKIE[key] = value;

浏览器向服务器发出请求时,会携带该服务器上所有有效的COOKIE到服务器端,通过firebug网络面板查看:



这里是php手册上对setcookie值的定义



有效期

默认:浏览器关闭时,COOKIE失效。该有效期的COOKIE称之为临时COOKIE,也叫会话COOKIE。

通过setcookie(key,value, 有效期=0)的第三个参数完成 设置有效期

允许设置有效期,达到控制失效时间点的目的。

例如:下面的操作,就是通过通过COOKIE的有效期完成的。

2月内免登陆,购物车关闭浏览器后,商品不消失。

有效期的表示方式为时间戳:函数time()可以获取当前时间戳!





一旦设置了有效期,到时立即失效,与浏览器是否关闭无关!

该cookie就称之为 持久COOKIE!

在设置COOKIE时,告知浏览器,该COOKIE的有效期。浏览器在发出请求时,判断COOKIE是否失效。也同时发生设置COOKIE时的响应阶段:

语法上,常见有效期设置如下:

某个时间点time()+N

0: 默认

Time()-1: 删除COOKIE的通用做法(标准做法)



可以设置一个很大的值,表示永不过期。通常是,PHP_INT_MAX(只是通常这么表示,其实际时间并不是永久)



有效路径

URL路径。

COOKIE仅仅在当前路径,和 后代路径有效。

假设:

设置COOKIE: URL:www.domain.com/path/setcookie.php

访问COOKIE:

下面的红色的访问不到的。

URL:www.domain.com/getcookie.php

URL:www.domain.com/dir/getcookie.php

以下的URL请求可以访问到的

URL:www.domain.com/path/getcookie.php,当前路径

URL:www.domain.com/path/sub/getcookie.php,后代,子路径

URL:www.domain.com/path/sub/dir/getcookie.php,后代,子路径/子路径/…

为什么会存在路径这个属性:

由于COOKIE每次请求时携带到服务器端。很多的 COOKIE数据,会导致请求数据变得庞大,将COOKIE划分到各个路径中,减少每个路径下COOKIE的数量。

允许通过setcookie()的第四个参数进行设置。

Setcookie(key,value,有效期,有效路径=’’);

常规的设置方法如下:



现在很多项目都是单入口,只有一个请求路径。

有效域名,常用

默认的 COOKIE仅仅在当前域名下有效

music.baidu.com/下,设置的cookie,仅仅在music.baidu.com下有效.

即使

picture.baidu.com/也不能使用

可以通过使用第五个参数的形式,进行所在的一级域名的设置,设置后,该一级域名下的所有的二级子域名全都生效。




在设置有效域名时,通常设置有效路径为根目录。因为不同的站点,路径结构不同,需要保证能使用!

Secure,是否仅安全连接发送到服务器

http:

https: 加密之后的http。

如果将COOKIE设置了该属性。那么在浏览器向服务器发出请求时,如果发现为非https请求,则不发送该COOKIE。默认为false。

HTTPonly,是否仅仅在http请求时所使用

默认值为false,当设置为true时 ,仅仅只能http请求使用,别的使用可能还包括(js,bom等)

值得注意的是

COOKIE数据仅仅支持字符串类型

第二个参数,一定要是字符串!



Cookie的Key,支持数组的写法



结果会导致

$_COOKIE中存在一个user的数组:



$_COOKIE存储请求时携带的COOKIE变量

$_COOKIE中,不会存储,当前脚本周期所设置的COOKIE。



下次再请求,该cookie就会携带!

(即你这次只是响应回让浏览器记录cookie值,但浏览器并没有请求,所以并没有带去cookie值,所以并没有值显示)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息