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

交互客
• 阅读 3225

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

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

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

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,Cookie,$_SESSION,$_COOCIE之间关系问题

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

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

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

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

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

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

这样子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.
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
莎利亚 莎利亚
4年前
PHP Cookie与Session的使用与区别
Cookie与SessionCookie和session是目前使用的两种存储机制。cookie是从一个WEB页到下一个WEB页面的数据传送方法,cookie存储在客户端;Session是让数据在页面中持续有效的一个传递方法,session存储在服务器端。掌握了cookie与session这两个技术,在WEB网站页面间信息传递的安全性是
喷火龙 喷火龙
4年前
go语言web开发框架_Iris框架讲解(六):Session的使用和控制
在实际的项目开发中,我们会经常有业务场景使用到Session功能。在iris框架中,也为我们提供了方便使用,功能齐全的Session模块。Session模块的源码目录为kataras/iris/sessions包。Session与Cookie的区别在学习web开发过程中,我们总会和session和cookie打交道。本节课我们学习sesion相关的
喷火龙 喷火龙
4年前
cookie和session的详解与区别
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。1.1 C
Stella981 Stella981
4年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Wesley13 Wesley13
4年前
Java认证:对session和cookie的一些理解
Java认证:对session和cookie的一些理解博客分类:java这篇文章虽然说的是JAVA中的session和cookie的使用,但是对于其他语言也是适用的。一、cookie机制和session机制的区别具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看
Stella981 Stella981
4年前
Django中的session的使用
一、Session的概念cookie是在浏览器端保存键值对数据,而session是在服务器端保存键值对数据session的使用依赖cookie:在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sess
Easter79 Easter79
4年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
4年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把