问题:
首先,有个网站登录用到了session;
然后,有一台电脑——————
用户A打开了IE7,登录网站,顺利登录;
接着,用户B在IE7上点开了一个新的选项卡,输入网址,登录网站,顺利登录;
这个时候!用户A按F5刷新!————会发现用户A的个人信息(假设是session变量存储的)变成了B的!!!这就是IE7、IE8的“选项卡”概念的毛病!所有选项卡只会打开一个IE进程,也就是:共用一个SESSION !
百度、google搜索答案~~~~说什么的都有,貌似根本没有解决问题(或者解决了也懒得说了)。
琢磨,测试。
经研究,参考了腾讯邮箱的搞法(url传SID!),成功解决,
---------------------------------------------------------------------
基本概念
session,中文翻译过来叫“会话”。
会话控制,在客户端保存一个唯一的会话标识符(即SID,默认名PHPSESSID),在服务器端,存储着该会话的数据(比如姓名、性别呀。。。等等)。我们要做的事就是:拿着这个会话标识符(SID),给服务器端,跟他讲:诺!这是我的卡!把我的东西都取出来!
---------------------------------------------------------------------
手册~~~~~~~
传递会话 ID
有两种方法传递一个会话 ID:
- cookie
- URL 参数
原理:
(1)手工生成SID并用url传递他到下一页;(为什么要手工?手工等于我强制他每次生成SID都不一样啊,而自动生成的话,会先看cookie,有,就读原来的;没有,生成新的。)
(2)读取传递过来的SID对应的session数据。
会话的安全性
这里先不考虑这个。其实也简单,无非就是url传参时加密啊,还有,启动会话的时候,在会话数据中放一个变量,然后随时检查有没有这个变量啊~~~~~这个变量表示会话是用户创建的——会话数据中没有这个变量,那就说明会话ID是假的!
简单例子如下:
<?
define('ua_seed','domain.com');
session_start();
if(!isset($_SESSION['check'])){
$_SESSION['check'] = md5($_SERVER['HTTP_USER_AGENT'].ua_seed);
}
else{
if($_SESSION['check'] != md5($_SERVER['HTTP_USER_AGENT'].ua_seed)){
exit('你是来搞破坏的~~~');
}
}
?>
具体方法:
假设有2个页面:index.php和page2.php 。
index.php代码:
<?php
//手工生成SID
$sid = md5(uniqid(rand()));//先搞个唯一的32位随机数
session_id($sid);//设置SID 关键!!!
//注意:session_id()和session_start()都会先检查有没有SID,没有,就生成一个新的!但是!session_id是放在session_start()之前的(不理解可详查手册)!你放在session_start()之后,貌似也不会报错,但是session_start()会先生成一个空的————临时文件去看就知道了!
/*系统临时文件夹找到这个 Session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容:
admin|N;
一般该内容是这样的结构:
变量名|类型:长度:值;
并用分号隔开每个变量。有些是可以省略的,比如长度和类型。
*/
session_start();
//session_regenerate_id();//这个函数是能再生成新的,但是必须放在session_start()之后,由于session_start()会生成空白的session文件,所以我弃之不用。
$_SESSION['username'] = rand();//这里搞个随机数,模拟下不同的登录用户名
$url="page2.php?sid=".$sid;//GET方式传递SID
header("refresh:0;url=".$url);//2秒钟后转向
?>
page2.php代码:
<?php
session_id($_GET['sid']);//关键!读取指定SID的东西!
session_start();
echo $_SESSION['username'];
?>
OK,现在登录吧,A登录了,好,A去尿尿了;B点开一个选项卡,也登录;A尿完回来了,按F5刷新~~~~不会变了。
搞定。