问题
大家都知道,session的sessionid的英文通过cookie来保存的,那么如果我们的浏览器禁用了cookie,还可以使用session吗?这道面试题是不是经常被问?你能答得出来吗?禁用cookie后,session还是可以使用的。
禁用后的情况
禁用cookie后,服务器每次session_start的时候都会创建³³³³单独一个的session文件,后果就是无法让多个页面共享同一份session
解决方法
使用URL重定向方法,在每个要使用session的页面的链接中都加上sessionid,然后在每个页面中都去请求这一份session文件就可以解决问题。这里我将使用商城来做案例讲解。如果没有禁用的饼干的话,下面的代码是可以使用的。
商城首页:goods.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>商品界面</title>
</head>
<body>
<h1>图书商城首页</h1>
<a href="doBuy.php?id=sn001&name=三国演义">三国演义</a><br/>
<a href="doBuy.php?id=sn002&name=水浒传">水浒传</a><br/>
<a href="doBuy.php?id=sn003&name=红楼梦">红楼梦</a><br/>
<a href="doBuy.php?id=sn004&name=西游记">西游记</a><br/>
<hr>
<a href="showCart.php">查看购物车商品</a>
</body>
</html>
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
处理购买界面:doBuy.php
<?php
session_start();
$id = $_GET['id'];
$name = $_GET['name'];
$_SESSION[$id] = $id.'==>'.$name;
echo "添加成功<br/>";
echo "<a href='goods.php'>回到首页</a>";
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
购物车界面:showCart.php
<?php
session_start();
foreach ($_SESSION as $key => $value) {
echo $value.'<br/>';
}
echo "<a href='goods.php'>回到首页</a>";
- 1
- 2
- 3
- 4
- 五
- 6
在每个超链接上都加上PHPSESSIONID的sessionid =
核心代码在这里:
if(isset($_GET['PHPSESSIONID'])){
session_id($_GET['PHPSESSIONID']);
}
session_start();
$sid = session_id();
- 1
- 2
- 3
- 4
- 五
首先判断是否有PHPSESSIONID参数是否存在,如果存在就使用这个sessionid来开启session,如果就没有创建³³新一个的session文件。然后在每个链接上都加上PHPSESSION=sessionid。
goods.php
<?php
if(isset($_GET['PHPSESSIONID'])){
session_id($_GET['PHPSESSIONID']);
}
session_start();
$sid = session_id();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>商品界面</title>
</head>
<body>
<h1>图书商城首页</h1>
<a href="doBuy.php?id=sn001&name=三国演义&PHPSESSIONID=<?php echo $sid;?>">三国演义</a><br/>
<a href="doBuy.php?id=sn002&name=水浒传&PHPSESSIONID=<?php echo $sid;?>">水浒传</a><br/>
<a href="doBuy.php?id=sn003&name=红楼梦&PHPSESSIONID=<?php echo $sid;?>">红楼梦</a><br/>
<a href="doBuy.php?id=sn004&name=西游记&PHPSESSIONID=<?php echo $sid;?>">西游记</a><br/>
<hr>
<a href="showCart.php?PHPSESSIONID=<?php echo $sid;?>">查看购物车商品</a>
</body>
</html>
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
doBuy.php
<?php
if(isset($_GET['PHPSESSIONID'])){
session_id($_GET['PHPSESSIONID']);
}
session_start();
$sid = session_id();
$id = $_GET['id'];
$name = $_GET['name'];
$_SESSION[$id] = $id.'==>'.$name;
echo "添加成功<br/>";
echo "<a href='goods.php?PHPSESSIONID=$sid'>回到首页</a>";
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
showCart.php
<?php
if(isset($_GET['PHPSESSIONID'])){
session_id($_GET['PHPSESSIONID']);
}
session_start();
$sid = session_id();
foreach ($_SESSION as $key => $value) {
echo $value.'<br/>';
}
echo "<a href='goods.php?PHPSESSIONID=$sid'>回到首页</a>";
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
使用SID常量
包含着会话名以及会话ID的常量,格式为“name = ID”,或者如果会话ID已经在适当的会话cookie中设定时则为空字符串。这和session_id()返回的是同一个ID。
使用use_trans_sid指定是否启用透明SID支持
编辑的文件的php.ini,修改use_trans_sid配置为1,即代表启用透明SID,抱歉,我的窗口没有测试出来。
本文探讨了在禁用Cookie的情况下如何实现Session管理。通过URL重写的方式传递Session ID,确保了不同页面间能共享同一Session。以一个商城示例详细展示了如何在PHP中实施此解决方案。
1万+

被折叠的 条评论
为什么被折叠?



