zoukankan      html  css  js  c++  java
  • <原创>一串简单的代码牵扯出的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

  • 相关阅读:
    Vim编辑器-Basic Visual Mode
    Vim编辑器-Windows
    Vim编辑器-Searching
    Vim编辑器-Text Blocks and Multiple Files
    Vim编辑器-Editing a Little Faster
    Vim编辑器-Basic Editing
    Android12系统源码分析:NativeTombstoneManager
    为什么色彩管理很重要?
    使用chrome调试代码时引入jquery
    抖音、微信超火中国红头像制作
  • 原文地址:https://www.cnblogs.com/gzchenjiajun-php/p/5036462.html
Copyright © 2011-2022 走看看