<原创>一串简单的代码牵扯出的session,cookie,$_session,$_cookie之间关系问题

    

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

a.php:  //报错

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

b.php: //abc

这个页面的值是abc,其实第一次看到这个答案我也很惊讶.

其实原理是这样的:

我们一直对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依旧可以打印出来.

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

-----------------------------------分割线-----------------------------------------

同样的道理可以用到session机制里,

在这幅图里,最终还是能够打印出$_SESSION的值,因为session_destroy将http中的session和超全局变量$_SESSION的关系分离了,详见手册

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

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

总结:

  • session_unset销毁的不是$_SESSION这个变量值(和unset这个函数不同,unset直接操作变量),而是http中的session值.具体可以自己分别开启与不开启session_start然后session_unset进行实验
  • $_SESSION/session值,$_COOKIE/cookie值不是对等的,cookie/session操作着$_COOKIE/$_SESSION变量值,所以在进行函数操作的时候一定要搞明白,他究竟是对变量操作还是http协议操作!
  • 让cookie过期做好的策略是将它过期.

欢迎转载,但一定要保存原址+作者

作者:PHP程序痴-妖都小陈

原文地址:http://www.cnblogs.com/gzchenjiajun-php/p/5036462.html

时间: 2024-10-24 00:10:46

<原创>一串简单的代码牵扯出的session,cookie,$_session,$_cookie之间关系问题的相关文章

基于Jquery 简单实用的弹出提示框

引言: 原生的 alert 样子看起来很粗暴,网上也有一大堆相关的插件,但是基本上都是大而全,仅仅几句话可以实现的东西,可能要引入好几十k的文件,所以话了点时间自己写了个弹出效果,放到项目上去发现效果还不错,这里贴出来,做个备忘,有需要的同学可以拿去,也可以作为一个参考. 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.d

依然是关于我空间那篇申请的日志《JavaScript axError:Unexpected token ILLEGAL 很简单的代码&hellip;&hellip;》

接下来要讲的日志现在的标题已经更改为<很简单的代码,但是无法--> 这篇日志地址:http://www.cnblogs.com/herbertchina/p/4475092.html 经过多次测试,给出如下提示: 1.如果你是360急速浏览器(360浏览器没测试)请谨慎打开:会加载失败导致崩溃,电脑cpu也会疯狂运转(CPU风扇突然变快),最后导致浏览器崩溃 2.如果你是IE浏览器(测试版本是IE11),可以无所顾忌 3.如果你是Google Chrome ,也会导致加载问题,但是浏览器不会崩

用代码&quot;写&quot;出扫描线效果图片

我们一般采用photoshop等做图工具制作电视扫描线效果图片:首先做一个黑白相间的图案,然后用这个图案进行填充,再调整图层的模式或者透明度,效果就出来了. 现在我们不用photoshop,用css和javascript来做,方法也很简单! 步骤一. 我们先准备一张图片,以我的图片为例,命名为”青山绿水.jpg”,图片大小为1000X543. 步骤二. 在body内插入一个table表格,为表格设置class属性,值为”tvline”,设置表格的背景图片为事先准备的图片. 步骤三. 建立一个cs

最短路径 简单的代码

看了这些代码之后 总结了一下 其实就那三个for 循环 一:找与v有连接的点 .二:从这些连接的点找到最小,把他看成是下一次的v . 三: 你要把有出现的那些边 更新掉 . 详解在代码里写出了 #include #include #include using namespace std ; #define N 100 #define M 100 typedef struct node { int matrix[N][M] ; int n ; int e ; }Dgraph ; void Diji

CSS代码写出的各种形状图形

做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片,今天就在这里教大家怎样用css代码写出各种规则不同的图形 1.正方形 #square {width: 100px;height: 100px;background: red;} 2.长方形 #rectangle { width: 200px; height: 100px; background: red;} 3.左上三角 #triangle-topleft { width: 0; height:

之前项目中用到的简单的自定义弹出提示框的实现,整理整理,当然开源的插件很多,但自己写的可以随意发挥

效果如下: html代码: <div class="container"> <div class="wrapper" style="background-color:white; position:relative;"> <div class="box" style="background-color:red; position:absolute; left:100px; top:300

JDBC的一些简单通用代码

JDBC的一些简单通用代码 功能包括 连接数据库 查询操作 执行sql语句 jdbc相关类的加载 关闭连接 获取数据库格式的当前时间 代码 package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleD

js日期格式简单转换代码

js日期格式简单转换代码: 未经修饰的东西总是狂野粗糙的,比如人没有经过良好的教育,这人可能会有各种问题,同样js中的时间格式也是如此,所以要对时间进行一定的格式化操作,下面是一段非常简单的代码实例和大家分享一下. 代码如下: function dateStr(x,y) { var z={ y:x.getFullYear(), M:x.getMonth()+1, d:x.getDate(), h:x.getHours(), m:x.getMinutes(), s:x.getSeconds() }

java:Spring框架1(基本配置,简单基础代码实现)

1.基本配置: 步骤一:新建项目并添加spring依赖的jar文件和commons-logging.xx.jar: 步骤二:编写实体类,DAO及其实现类,Service及其实现类; 步骤三:在src下新建配置文件applicationContext.xml,并配置bean节点和property: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springfr