深入解析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木马攻击防御之道
Mar 24 PHP
php checkbox 取值详细说明
Aug 19 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
linux iconv方法的使用
Oct 01 PHP
php shell超强免杀、减少体积工具实现代码
Oct 16 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
深入理解curl类,可用于模拟get,post和curl下载
Jun 08 PHP
php的慢速日志引起的Mysql错误问题分析
May 13 PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 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实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
浅析PHP开发规范
2018/02/05 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
微信小程序实现首页弹出广告
2020/12/03 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
python实现简易通讯录修改版
2018/03/13 Python
Python可迭代对象操作示例
2019/05/07 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
Spy++的使用方法及下载教程
2021/01/29 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
国际领先的学术出版商:Springer
2017/01/11 全球购物
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
质检部部长职责
2013/12/16 职场文书
幼教毕业生自我鉴定
2014/01/12 职场文书
妇产医师自荐信
2014/01/29 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
家装业务员岗位职责
2015/04/03 职场文书
学校捐书倡议书
2015/04/27 职场文书
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS
HTML常用标签超详细整理
2022/03/19 HTML / CSS
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python