深入解析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开发文件系统实例讲解
Oct 09 PHP
Discuz!下Memcache缓存实现方法
May 28 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
Apr 25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
PHP使用CURL实现多线程抓取网页
Apr 30 PHP
php组合排序简单实现方法
Oct 15 PHP
PHP实现文件上传下载实例
Oct 18 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
php的单例模式及应用场景详解
Feb 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
如何过滤高亮显示非法字符
2006/10/09 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP 函数执行效率的小比较
2010/10/17 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
python访问sqlserver示例
2014/02/10 Python
python flask 多对多表查询功能
2017/06/25 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
python编写猜数字小游戏
2019/10/06 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
C#中的验证控件有几种
2014/03/08 面试题
毕业生简单求职信
2013/11/19 职场文书
大学旷课检讨书
2014/01/28 职场文书
Python实现数据的序列化操作详解
2022/07/07 Python
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android