深入解析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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
IStream与TStream之间的相互转换
Aug 01 PHP
fgetcvs在linux的问题
Jan 15 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 PHP
PHP自带方法验证邮箱是否存在
Feb 01 PHP
Yii针对添加行的增删改查操作示例
Oct 18 PHP
jQuery+php简单实现全选删除的方法
Nov 28 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
PDO::_construct讲解
Jan 27 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
可以用鼠标拖动的DIV实现思路及代码
2013/10/21 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
Vant picker 多级联动操作
2020/11/02 Javascript
python使用matplotlib绘制柱状图教程
2017/02/08 Python
python调用百度REST API实现语音识别
2018/08/30 Python
使用python实现快速搭建简易的FTP服务器
2018/09/12 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
如何基于线程池提升request模块效率
2020/04/18 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
产品质量承诺书范文
2014/03/27 职场文书
基层党组织公开承诺书
2014/03/28 职场文书
歌咏比赛主持词
2015/06/29 职场文书
航班延误投诉信
2015/07/02 职场文书