深入解析Session是否必须依赖Cookie


Posted in PHP onAugust 02, 2013

php中的session可以默认情况下是使用客户端的cookie(以便和普通意义上的cookie区别,我称之为session cookie,普通意义上的cookie为cookie)来保存session id的,但是php中的session是否只能使用session cookie呢?

当然不是,否则何必还弄个session出来,不如直接用cookie算了.session的一大优点就是当客户端的cookie被禁用时会自动把session id附在url中,这样再通过session id就能记住session变量了.

下面我写两个文件来证实一下,首先在浏览器中设置禁用cookie.

<?
//文件名为test1.php 
session_start(); 
session_register("url"); 
$url="test2.php"; 
echo "<a href=$url>goto test2.php</a>"; 
?><SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif"> </SPAN>

<?//文件名为test2.php 
session_start(); 
if (session_is_registered("url")) { 
   echo "congratulations."; 
   $url="test1.php"; 
   echo "<a href=$url>goto test1.php</a>"; 
} else 
   echo "failed."; 
?>

现在在浏览器中输入"http://localhost/test1.php",把鼠标移到链接上看看状态栏上的地址,不是简单的"http://localhost/test2.php",而是这种形式:"http://localhost/test2.php?phpsessid=6e3610749f7ded3784bc4a4dd10f879b".

你还可以查看html的源文件,源文件是这种形式:
<a href="test2.php?phpsessid=6e3610749f7ded3784bc4a4dd10f879b">goto test2.php</a>
所以说这完全是php的功劳,和浏览器无关,也就是说无论你用什么浏览器session都有效,而不是有的人认为的只对ie有用.

但是,我们的超链接是语句是由echo语句输出的,如果超链接不包含在php的标签<? ?>之内会怎样呢?还是写个例子来验证一下,把test1.php稍作修改:

<?php 
session_start(); 
session_register("url"); 
$url="test2.php"; 
echo "<a href=$url>goto test2.php</a>";?> 
<a href="test2.php">(html形式)goto test2.php</a>

在浏览器中输入"http://localhost/test1.php",分别把鼠标移到两个链接上看看有没有不同?可以看到,两个链接是完全相同的,后面都会自动附带session id.所以不必担心没被包含在php标签中的链接会失效,php不会这么笨的.

但是在使用时要注意必须先用session_start()函数告诉php开始用session,哪怕你在这个文件中只有html代码,如:
<? session_start();?>
<html>
<head>
<body>
<a href=test2.php>gogogo</a>
…………

记得有人说过这个优点只能在linux/unix下才能发挥出来,而我用的win2000p+apache1.3.17+php4.0.4pl1,php为apache模块方式,却照样可以.恰恰相反,我转到linux下去测试时反而不行了.其实是在编译时的一个选项--enable-trans-sid控制了这项功能能否有用.而按照php默认来编译时是没有打开这项功能的,只需重新编译时加入它就可以了.我的配置为apache1.3.17+php4.0.4pl1,php为apache模块方式,在linux重新编译后用netscape navigator4.7测试可以通过(这更证明了和浏览器无关).

只靠session是不能跨窗口使用的,即使你启用了cookie,当你在一个窗口中有一个合法的session id(记录在session cookie中,不是url中),再新开一个窗口进入相同页面时,你会重新拥有一个新的session id,而与前一个窗口互不影响.

要想跨窗口使用同一个session id就只能在url后指定session id,也就是说如果你把带有session id的的窗口的url复制,在新开的窗口中粘贴一下,还是照样使用的.知道了session id的这个原理要实现跨窗口session还是不难的,可以把cookie与session结合起来,首先取得当前合法的session id,然后把它记录在cookie中,在其它窗口读取cookie就可获得当前的session id了.

PHP 相关文章推荐
PHP与MySQL交互使用详解
Oct 09 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
Jun 03 PHP
解析htaccess伪静态的规则
Jun 18 PHP
PHP进程同步代码实例
Feb 12 PHP
php数组键名技巧小结
Feb 17 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP实现的抓取小说网站内容功能示例
Jun 27 PHP
php中用date函数获取当前时间有误的解决办法
Aug 02 #PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
Aug 01 #PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 #PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 #PHP
通过table标签,PHP输出EXCEL的实现方法
Jul 24 #PHP
Ajax+PHP快速上手及简单应用说明
Jul 24 #PHP
table标签的结构与合并单元格的实现方法
Jul 24 #PHP
You might like
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
详解php中 === 的使用
2016/10/24 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
python tkinter控件布局项目实例
2019/11/04 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
Python实现ATM系统
2020/02/17 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
优秀求职自荐信怎样写
2013/12/18 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
校园安全教育广播稿
2014/02/17 职场文书
应届生自荐信范文
2014/02/21 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
庆六一宣传标语
2014/10/08 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
单位实习介绍信
2015/05/05 职场文书
爱国主义主题班会
2015/08/14 职场文书
技术入股协议书
2016/03/22 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle