深入解析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+MYSQL的文章管理系统(一)
Oct 09 PHP
PHP 防恶意刷新实现代码
May 16 PHP
php处理json时中文问题的解决方法
Apr 12 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
Symfony2实现从数据库获取数据的方法小结
Mar 18 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
php app支付宝回调(异步通知)详解
Jul 25 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
Feb 14 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 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
Python实现简单的四则运算计算器
2016/11/02 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
详解Python传入参数的几种方法
2019/05/16 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
Python连接mysql方法及常用参数
2020/09/01 Python
数学兴趣小组活动总结
2014/07/08 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
《日月潭》教学反思
2016/02/20 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
Python学习之os包使用教程详解
2022/03/21 Python