深入解析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
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
Apr 07 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
Zend Framework常用校验器详解
Dec 09 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
Feb 15 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
Jun 17 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 PHP
Laravel定时任务的每秒执行代码
Oct 22 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 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/11/16 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
jQuery 性能优化指南 (1)
2009/05/21 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
Python编程入门的一些基本知识
2015/05/13 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
销售经理岗位职责
2014/03/16 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
大学生工作自荐书
2014/06/16 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android