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

所属分类: 网络编程 / PHP编程 阅读数: 294
收藏 0 赞 0 分享

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 中move_uploaded_file 上传中文文件名失败

这篇文章主要介绍了PHP 中move_uploaded_file 上传中文文件名失败的原因分析及解决方法 ,需要的朋友可以参考下
收藏 0 赞 0 分享

CentOS7编译安装php7.1的教程详解

这篇文章主要介绍了CentOS7编译安装php7.1的教程详解,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
收藏 0 赞 0 分享

PHP信号处理机制的操作代码讲解

在本篇文章里小编给大家分享了关于PHP信号处理机制的操作的相关知识点内容,需要的朋友们学习下。
收藏 0 赞 0 分享

ThinkPHP3.2.3框架邮件发送功能图文实例详解

这篇文章主要介绍了ThinkPHP3.2.3框架邮件发送功能,结合图文与实例形式详细分析了基于thinkPHP框架进行邮件发送的相关原理、配置及操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

一文掌握PHP Xdebug 本地与远程调试(小结)

这篇文章主要介绍了一文掌握PHP Xdebug 本地与远程调试(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Laravel路由研究之domain解决多域名问题的方法示例

这篇文章主要介绍了Laravel 路由研究之domain解决多域名问题的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

PHP设计模式之策略模式原理与用法实例分析

这篇文章主要介绍了PHP设计模式之策略模式原理与用法,结合实例形式较为详细的分析了策略模式的概念、原理及php实现与使用策略模式的相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

php使用lua+redis实现限流,计数器模式,令牌桶模式

这篇文章主要介绍了php使用lua+redis实现限流,计数器模式,令牌桶模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Laravel多域名下字段验证的方法

这篇文章主要给大家介绍了关于Laravel多域名下字段验证的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Laravel具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

PHP中quotemeta()函数的用法讲解

今天小编就为大家分享一篇关于PHP中quotemeta()函数的用法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享
查看更多