资讯专栏INFORMATION COLUMN

一串简单的代码牵扯出的Session,Cookie,$_SESSION,$_COOCIE之间关系问题

leo108 / 2410人阅读

摘要:发现有很多朋友一直误以为和,和是对等的,特意写了一篇文章讨论一下他们之间的关系,免得在面试中掉坑以及在项目中出错上述代码会产生怎么样的结果报级别错误这个页面的值不难将会报出一个错误因为的返回值具有慢一拍特性在页面中设置后当客户端第一次访问时

发现有很多朋友一直误以为Session和$_SESSION,Cookie和$_COOKIE是对等的,特意写了一篇文章讨论一下他们之间的关系,免得在面试中掉坑以及在项目中出错

上述代码会产生怎么样的结果?

a.php: //报notice级别错误[echo $_COOKIE[‘a’]

这个页面的值不难,将会报出一个notice( Undefined index: a)错误,因为Cookie的返回值具有慢一拍特性,在页面中设置setcookie后,当客户端第一次访问时,需要把Cookie键值对包含在http响应头返 回给客户端,当你下次访问的时候,客户端会着这份具有Cookie值的请求头请求服务器,服务器进行一系列判断(包括对Cookie值范围,Cookie有效期),也就知道当前的客户端存在这一份Cookie值,调用显示出来,然后再用 到其他业务逻辑.。

b.php: //abc

这个页面的值是abc,其实第一次看到这个答案我也很惊讶,感觉上Cookie值不是在A页面被unset掉了吗?怎么还会有呢?

其实原理是这样的:

我们一直对Cookie/Session,$_COOKIE /$_SESSION混为一谈了,其实呢,这四个(两组)是独立开来的,Cookie/Session是属于http协议里的值,$_COOKIE /$_SESSION是属于php里面的全局变量.我们在setcookie的时候,实际上给http协议中的Cookie赋值,而http中的Cookie 与php中的超全局变量$_COOKIE自动关联上(注意只是关联上,类似传值赋值的关系).所以$_COOKIE才有这个值abc,并不是直接将值赋给$_COOKIE超全局变量上的.所以同样道 理,unset($_COOKIE)销毁的是$_COOKIE这个变量,与http头中的Cookie值无关(压根没有影响到),所以在b.php依旧可以打印出来(再输出时$_COOKIE[‘a’]依旧从http协议的Cookie拷贝值)。

解决办法就是 setcookie(a,”,-1)将这个Cookie设置为过期,那么b.php就不能再获取到了.

————————————分割线————————————–

类似的道理也可以用到Session机制里,

在这幅图里,最终还是能够打印出$_SESSION的值,因为Session_destroy将http中的Session和超全局变量$_SESSION的关系分离了,并且销毁当前Session_id对应的Session值,详见手册

Session_destroy 是把Session和$_SESSION之间的关系割开了,如果你想重新恢复Session函数功能,你就要重新打开session_start(),;例如下图,

Session_unset和普通unset是一个道理,但操作的是HTTP协议中的Session值,可看手册

这样子Session值就会被顺利删掉,那么与它关联的$_SESSION超全局变量值也就消失了

总结:

session_unset销毁的不是$_SESSION这个变量值,而是http中的Session值.具体可以自己分别开启与不开启session_start然后session_unset进行实验
unset这个函数不同,unset直接操作变量,Cookie和$_COOKIE是传值赋值关系
session_destroy的作用是将SESSION与$_SESSION之间的联系切除掉
$_SESSION/Session值,$_COOKIE/Cookie值不是对等的,cookie/Session操作着$_COOKIE/$_SESSION变量值,所以在进行函数操作的时候一定要搞明白,他究竟是对变量操作还是http协议操作!
让Cookie过期最好的策略是将它过期而不是unset.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21512.html

相关文章

  • 从koa-session源码解读session本质

    摘要:前言,又称为会话控制,存储特定用户会话所需的属性及配置信息。类先看构造函数居然啥屁事都没干。由此基本得出推断,并不是服务器原生支持,而是由服务程序自己创建管理。类老规矩,先看构造函数接收了实例传来和,其他没有做什么。 前言 Session,又称为会话控制,存储特定用户会话所需的属性及配置信息。存于服务器,在整个用户会话中一直存在。 然而: session 到底是什么? session...

    remcarpediem 评论0 收藏0
  • 前端应该知道web登录

    摘要:客户端发起非登录请求时,服务端通过中的找到对应的来知道此次请求是谁发出的。数量随着登录用户的增多而增多,存储会增加很多。还记得在上家公司做全干工程师的时候,基本从页面写到运维,当时做登录这块的时候,被session、cookie、token各种概念差点整蒙圈了,上网查询相关概念,发现很多人都是类似的疑惑,比如:showImg(https://user-gold-cdn.xitu.io/201...

    NervosNetwork 评论0 收藏0
  • sessioncookie

    摘要:的作用就是为了解决协议无状态的缺陷所作的努力。的内容主要包括名字,值,过期时间,路径和域。这种生命期为浏览器会话期的被称为会话。而机制采用的是一种在服务器端保持状态的解决方案。中的有效期默认分钟,也就是说,客户端超过分钟,当前就会失效。 会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段。而会话,就是用户通过浏览器和服务器的一次通话。 为什么要有会话控制? 因...

    ruicbAndroid 评论0 收藏0
  • sessioncookie

    摘要:的作用就是为了解决协议无状态的缺陷所作的努力。的内容主要包括名字,值,过期时间,路径和域。这种生命期为浏览器会话期的被称为会话。而机制采用的是一种在服务器端保持状态的解决方案。中的有效期默认分钟,也就是说,客户端超过分钟,当前就会失效。 会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段。而会话,就是用户通过浏览器和服务器的一次通话。 为什么要有会话控制? 因...

    Salamander 评论0 收藏0
  • 聊聊鉴权那些事

    摘要:什么是鉴权鉴权是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。这种方式的前提是,每个获得密码的用户都已经被授权。接下来就一一介绍一下这三种鉴权方式。 在系统级项目开发时常常会遇到一个问题就是鉴权,身为一个前端来说可能我们距离鉴权可能比较远,一般来说我们也只是去应用,并没有对权限这一部分进行深入的理解。 什么是鉴权 鉴权:是指验证用户是否拥有访问系统的权利。传统的鉴权是...

    wslongchen 评论0 收藏0

发表评论

0条评论

leo108

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<