深入解析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中的类-什么叫类
Nov 20 PHP
用php实现批量查询清除一句话后门的代码
Jan 20 PHP
Apache+php+mysql在windows下的安装与配置图解(最新版)
Nov 30 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
Jun 17 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
微信支付开发订单查询实例
Jul 12 PHP
PHP开发实现快递查询功能详解
Apr 08 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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实现文件上传二法
2006/10/09 PHP
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
php动态生成JavaScript代码
2009/03/09 PHP
php smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
如何在PHP中使用数组
2020/06/09 PHP
javascript 禁止复制网页
2009/06/11 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
TensorFlow损失函数专题详解
2018/04/26 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
Python将字典转换为XML的方法
2020/08/01 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
人事档案接收函
2014/01/12 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
2019年入党思想汇报
2019/03/25 职场文书
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL
Java的Object类的九种方法
2022/04/13 Java/Android