php学习笔记10:会话技术,cookie

会话技术

COOKIE的基本使用

cookie原理

cookie技术:服务器将数据通过HTTP响应存储到浏览器上,浏览器可以在以后携带对应的cookie数据继续访问服务器.

1. 第一次请求时,php通过setcookie函数将数据通过http协议响应头传输给浏览器

2. 浏览器在第一次响应的时候将cookie数据保存到浏览器

3. 浏览器后续请求同一个网站的时候,会自动检测是否存在cookie数据,如果存在将在请求头中将数据携带到服务器.

4. php执行的时候会自动判断浏览器请求中是否携带cookie,如果写到,自动保存到$_COOKIE中

5. 利用$_COOKIE访问cookie数据

 

设置cookie信息

setcookie函数用来设置cookie信息.如果成功,该函数返回 TRUE。如果失败则返回 FALSE。

格式:setcookie(cookie名字,值);

  • cookie名字:字符串
  • cookie值:必须是简单类型中的字符串和整数.

setcookie()php官网参考 setcookie()菜鸟教程参考

详细语法:  setcookie(name,value,expire,path,domain,secure)

参数描述
name必需。规定 cookie 的名称。
value必需。规定 cookie 的值。
expire可选。规定 cookie 的过期时间。

time()+3600*24*30 将设置 cookie 的过期时间为 30 天。如果这个参数没有设置,那么 cookie 将在 session 结束后(即浏览器关闭时)自动失效。

path可选。规定 cookie 的服务器路径。

如果路径设置为 "/",那么 cookie 将在整个域名内有效.如果路径设置为 "/test/",那么 cookie 将在 test 目录下及其所有子目录下有效。默认的路径值是 cookie 所处的当前目录。

domain可选。规定 cookie 的域名。

为了让 cookie 在 example.com 的所有子域名中有效,您需要把 cookie 的域名设置为 "example.com"即可。当您把 cookie 的域名设置为 www.example.com 时,cookie 仅在 www.example.com中有效。

secure可选。规定是否需要在安全的 HTTPS 连接来传输 cookie。如果 cookie 需要在安全的 HTTPS 连接下传输,则设置为 TRUE。默认是 FALSE。

读取cookie信息

$_COOKIE数组

如上,先前在28php脚本中存的localhost的cookie,在29php文件中可以自由读取.这就是cookie的作用.

小结:cookie(会话技术)能够实现跨脚本共享数据

cookie高级使用

cookie生命周期

cookie在浏览器的生存期间:

  • 1. 默认(不设定)时的生命周期:直到浏览器关闭(会话结束)
  • 2. 设定为一个常规日期戳的周期:通过setcookie第三个参数可以限定生命周期,是用时间戳来管理,从格林威治时间开始

以下示例演示几个cookie生命周期:

我们关掉浏览器.再重新打开浏览器,这时候发现:

  • 3. 设定为0的生命周期:cookie生命周期为0,就是普通设置(默认设置),会话结束过期.

  • 4. 删除1个cookie的做法:服务器没有权限去操作浏览器上的内容(不可能删除).可以通过生命周期来让浏览器自动判断cookie是否有效:无效则删除
  • 4.1清空cookie数据内容

  • 4.2设定时间戳过期

cookie作用范围

作用范围:不同的文件夹层级中,设定的cookie默认是在不同的文件夹下有访问限制.

上层文件夹中设定的cookie可以在下层(子)文件夹中访问.

子文件夹中设定的cookie不能在上层文件夹中访问.

  •  1. 默认(不设定)范围:就是用cookie默认的作用范围

示例,我们在当前目录的father.php中设置cookie father1;在当前目录下的 ./son/son.php中设置cookie son1 :

  • 2. 设定为"/"的含义:告知浏览器当前cookie的作用范围是网站根目录.

setcookie(名字,值,生命周期,作用范围);

cookie跨子域

跨子域:在同一域名下,abc.com可以有多个子域名如1.abc.com, 2.abc.com . 它们搭建在不同的服务器(文件夹)上,我们可以通过cookie设置实现对应的cookie共享访问.注意:默认是不允许跨子域访问.

  • 1. 设定cookie的有效域名:不同的域名不能跨域名共享cookie,可以通过setcookie的第五个参数来控制:

格式:setcookie(cookie名,cookie值,生命周期,作用范围,有效域名);

  • 2. 不设定时的默认有效域名

如上,不设定时,各网站cookie是互相独立的,不可以跨域名访问

  • 3. 跨子域的设定方法:在设定域名访问的时候设定上级域名即可.

如上,setcookie时候设定有效域名为:myitcast.com,则所有myitcast.com的子域名网站都可以访问到到这个cookie.

cookie数组数据

cookie本身只支持简单数据(数字或者字符串),能够保留的数据本身有限,也不成体系.如果需要使用cookie来保留一组数据的话,想办法凑成数组(cookie不支持数组)

如上演示,cookie不支持数组.可使用以下方法:

设置形式: setcookie('array[key1]',value1);

读取形式:$_COOKIE['array']['key1'];

注意:在浏览器眼中这不是数组,在php眼中是数组.一定要在[]中指定下标,千万不能省略下标!

思考:如果我们setcookie的时候省略下标,系统会不会自动给我们分配下标呢?结果如下:

如上之解释:[0][1][2]][3]为旧cookie(不是本次脚本运行的结果);此时运行脚本,浏览器生成[4]号cookie,并依次按程序赋值1,2,3,4;发生数据覆盖,最终[4]号cookie=4.

如上,清空浏览器缓存再运行一次,这次观察数据覆盖更直观.

结论:千万不可以省略下标,会造成cookie数据污染/数据覆盖!因为浏览器(客户端)本质上不支持cookie数组!(仅php服务端支持cookie数组,但php不可能控制客户端的浏览器,发生cookie数据覆盖的行为是浏览器做的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值