session不一定必须依赖cookie
一般来说,cookie与session被认为是两种不同的缓存机制。cookie采用的是在客户端存储方案, 而session采用的是在服务器端存储方案。
但是,一般情况下,如果浏览器禁用了cookie,session同样也无法使用了!这是为什么呢?原来,服务器在每次session_start()开启session的时候会先检测一下session_id,如果存在则继续使用之前创立的session文件,如果不存在则重新创建一个session文件来存储新的缓存,从而之前session也就失效了,而这个session_id默认是通过cookie传递的,所以浏览器一禁用cookie,session_id得不到传递,session也就失效了。
那么,如何解决客户端禁用cookie的问题呢!
1、设置php.ini中的session.use_trans_sid = 1 让php自动跨页传递session_id。
2、手动通过url传递session_id
3、用文件、数据库等形式保存session_id,在跨页的时候手动调用。
为了验证下以上三点,特意从网上找了三个例子:
示例1:
s1.php
<?php
session_start();
$_SESSION[’var1’]="测试user_trans_sid";
$url="<a href=".""s2.php">下一页</a>";
echo $url;
?>
s2.php
<?php
session_start();
echo "传递的session变量var1的值为:".$_SESSION[’var1’];
?>
运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“测试user_trans_sid”。
现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“测试user_trans_sid”
ps:这里需要补充一下,部分服务器设置完session.use_trans_sid=1之后session仍然无效,原因是php.ini中还有这么一个选项 session.use_only_cookies=1 表示是否只开启基于cookie的session,如果想要设置生效必须把它设为 session.use_only_cookies=0
示例2:
s1.php
<?php
session_start();
$_SESSION[’var1’]="url传值测试";
$sn = session_id();
$url="<a href=".""s2.php?s=".$sn."">下一页</a>";
echo $url;
?>
s2.php
<?php
session_id($_GET[’s’]);
session_start();
echo "传递的session变量var1的值为:".$_SESSION[’var1’];
?>