项目实践
结构图
环境
- 启动Apache2服务器
service apache2 start
- 进入目录
cd /var/www/html
- 新建php文件或者html,写代码
<?php ....... ?>
- 浏览器打开访问php
- 常见问题
//文件没有写入:一般就是linux下的权限问题 sudo chmod -R 777 /var/www/
有三个页面
- MyHall.php --------购物大厅
- ShopProcess.php --------保存session
- ShowCart.php ----------展示
第一个页面
MyHall.php ----------购物大厅
<?php
//购物大厅
echo "<h1>欢迎购买</h1>";
echo "<a href='ShopProcess.php?bookid=s1&bookname=A'>A</a>";
echo "<a href='ShopProcess.php?bookid=s2&bookname=B'>B</a>";
echo "<a href='ShopProcess.php?bookid=s3&bookname=C'>C</a>";
echo "<a href='ShopProcess.php?bookid=s4&bookname=D'>D</a>";
echo "<hr/>";
echo "<a href='ShowCart.php'>查看购买的商品列表</a>";
?>
第二个页面
ShopProcess.php-----------处理请求
<?php
//接受用户购买请求,并把书保存在session中
$bookid=$_GET['bookid'];
$bookname=$_GET['bookname'];
//保存到session中
session_start();
$_SESSION["$bookid"]=$bookname;
echo "<br/>购买商品成功!";
echo "<br/><a href='MyHall.php'>返回购物大厅</a>";
?>
第三个页面
ShowCart.php-------------展示
<?php
session_start();
echo "<h1>购物车商品有</h1>";
foreach($_SESSION as $key=>$val){
echo "<br/> -----------$val";
}
?>
注意session中key-value的储存方式中,key不能为数字
思考:
如果用户禁用浏览器的cookie 那么就不能在一次会话中用同一份session
原因在于:在禁用cookie以后,的确是在服务器端创立了session文件, 服务器也的确是返回来set cookie的信息。但是因为浏览器禁用了cookie所以不会接受到。 所以每一次发送请求都会创建新的session,
当用户禁用cookie以后,每次访问的时候,都会创建一个session 后果就是无法让多个php页面去共享同一份session文件,糟糕了
解决方案:
从底层机制入手,首先要明白,为什么多个页面可以共享session。 从 cookie session http 这三个方面入手解决事情。
在没有禁用cookie的时候,会传递一个PHPSESSID这个东西,所以我们可以先获取这个PHPSESSID,然后我们自己来传递啊
然后叫服务器不要创建新的session,而是获取那个sessionId
在MyHall.php中添加如下东西
session_start(); //开启session
$sid=session_id(); //获取sessionid
echo "<a href='ShopProcess.php?bookid=001&bookname=第一本书&PHPSESSID=&sid>第一本书</a><br/>";
在ShowCart.php中添加如下东西
//不能让服务器创建一个新的session
//注意:设置session_id()必须在session_start()之前调用
if(isset(&_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
总结问题
请问客户端禁用了cookie,怎么实现session技术共享多个页面
答:
- 方案一 在每个超链接上添加一个PHPSESSID=sessionId;
同时在每个页面加入if(isset($_GET['PHPSESSID'])){ // 设置session_id session_id($_GET['PHPSESSID']); } session_start();....
- 方案二 使用常量 在超链接action header("Location:xx")可以直接拼接SID常量即可
echo "sid===".SID.; 直接传入SID - 方案三 透明的SID支持
php.ini 配置选项,里面有一个session.use_trans_sid=0设置为1
(在herf action header会自动添加SID,但是js跳转不会自动增加); 重启apache可以生效