深入解析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读取javascript设置的cookies的代码
Apr 12 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 PHP
php数组添加元素方法小结
Dec 20 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
PHP四种基本排序算法示例
Apr 09 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
PHP图像处理类库及演示分享
May 17 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
python脚本监控docker容器
2016/04/27 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
Django实现发送邮件功能
2019/07/18 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
计算机本科生自荐信
2013/10/15 职场文书
电台实习生求职信
2014/02/25 职场文书
企业诚信承诺书
2014/05/23 职场文书
保护地球的宣传语
2015/07/13 职场文书
德能勤绩工作总结
2015/08/11 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers