您的位置:首页 > 其它

浏览器在不开启Cookie下Session处理小结

2012-02-29 18:08 537 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。/article/4319826.html

记得刚开始接触web开发的时候就遇到这类的问题关于Session和Cookie的一些争论。两者都是用来暂存数据的,这里就不说Session和Cookie的区别了,一般情况下Session需要Cookie的支持,但是有时候客户端安全设置高了那么Cookie就会被禁用(虽然到现在我还没有在实际开发中遇到过)但是这种情况是确实会存在的。下面我们来说下在Cookie禁用了以后Session怎么用,(注意:在一个脚本是可以用的 关键同一服务器不同脚本的访问)

首先Session依赖Cookie的地方在于Cookie记录下一个唯一的标识 sessionid,服务器端默认的会读取客户端的cookie中的sessionid如果没有的情况下那么session就会丢失,那么关键点就在于sessionid的获取上。

其次如果只有sessionid那么也是无法获取或者解析session中的这个id的数据那么这个问题就是session的存储问题,如果禁用了cookie那么session的存储就要我们特别处理不管是存到数据库还是文件中,需要单独存储,这里因为为了脚本的简单就用sessionid 作为文件名存储session的数据

今天写了一个小脚本用来测试,

第一步:这一步是我在做测试中突然想到的如果客户端禁用了Javascript这里必须支持Javascript所以要验证下

<html>
<head>
<title>客户端Javascript/Cookie/Session 检测</title>
<meta charset="UTF-8"/>
<script type="text/Javascript">
var phpZF = {};
phpZF.checkJavascriptEnable = function(){//检查浏览器是否支持Javascript
var check_javascript_enable = document.getElementById('phpZF_check_javascript_enable');
check_javascript_enable.parentNode.removeChild(check_javascript_enable);
}

window.onload = function(){ //这里用的是onload domready更好,要判断domready需要另写代码,回头单独写
phpZF.checkJavascriptEnable();//检查浏览器是否支持Javascript

}

</script>
</head>
<body>
<div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript</h1></div>
</body>
</html>

如果客户端不支持Javascript那么就会有文本提示让用户开启

第二步:检测是否支持Cookie

关键函数

phpZF.checkCookieEnable = function(){//检查浏览器是否开启Cookie
var cookie_enable = false;
if(navigator.cookiesEnabled)
return true;
document.cookie = "checkCookie=yes";
var cookieSet = document.cookie;
if(cookieSet.indexOf("checkCookie=yes") > -1)
cookie_enable = true;
document.cookie = "";
return cookie_enable;
}

如果开启那么很好我们正常流程走

假如不开启,那么我会在浏览器载入完成后的时候重新载入,不过这次载入我会在原来的url后面加上一个浏览器不支持cookie的参数

PHP接收后就会特别处理session

关键函数

Javascript

phpZF.unableCookieShareSession = function() { //在关闭Cookie的情况下使用session
alert('对不起,您的浏览器Cookie功能禁用,请开启');
var session_id = '<?php echo $session_id;?>';
var parms=new RegExp("[?]");
if(session_id == 0){
var newURL = document.URL + '?CookieUnable=1';
if(parms.exec(document.URL) !== null)
newURL = document.URL + '&CookieUnable=1';
window.location.href = newURL;
}else{
var share_Session = document.getElementById('phpZF_share_Session');
if(parms.exec(share_Session.href) !== null){
share_Session.href = share_Session.href + '&session_id='+session_id;
} else {
share_Session.href = share_Session.href + '?session_id='+session_id;
}
}
}

PHP

<?php
session_start();
isset($_SESSION['session'])?null:$_SESSION['session']='session';
if(@$_GET['CookieUnable'] == '1' ){//如果当前浏览器关闭cookie 那么重新加载
$session_id = session_id(); //获取当前的session_id;
$file_name = $session_id.'.txt';//这里暂时用文件保存 可以用任何的存储介质,通常为数据库这里为了讲述方法用创建文件解决
$handle = fopen($file_name,'w');
fwrite($handle, serialize($_SESSION));
fclose($handle);
}else{
$session_id = 0;
}
?>

然后在页面中我会对特定的url中加上session_id 这样在网站中就可以使用session_id了

<body>
<div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript</h1></div>
<div>
<a id="phpZF_share_Session" href="show.php">Server Session Information</a>;
</div>
</body>
</html>

那么这样就算处理完成,整体的代码

目录结构:

set.php //入口

show.php //共享session 查看session

20rt5ja239sipblatlng8o0084.txt//这个你可以指定个目录或者数据库存储 session数据

20rt5ja2*************o0084.txt

set.php Code

<?php
session_start();
isset($_SESSION['session'])?null:$_SESSION['session']='session';
if(@$_GET['CookieUnable'] == '1' ){//如果当前浏览器关闭cookie 那么重新加载
$session_id = session_id(); //获取当前的session_id;
$file_name = $session_id.'.txt';//这里暂时用文件保存 可以用任何的存储介质,通常为数据库这里为了讲述方法用创建文件解决
$handle = fopen($file_name,'w');
fwrite($handle, serialize($_SESSION));
fclose($handle);
}else{
$session_id = 0;
}
?><html>
<head>
<title>客户端Javascript/Cookie/Session 检测</title>
<meta charset="UTF-8"/>
<script type="text/Javascript">
var phpZF = {};
phpZF.checkJavascriptEnable = function(){//检查浏览器是否支持Javascript
var check_javascript_enable = document.getElementById('phpZF_check_javascript_enable');
check_javascript_enable.parentNode.removeChild(check_javascript_enable);
}
phpZF.checkCookieEnable = function(){//检查浏览器是否开启Cookie var cookie_enable = false; if(navigator.cookiesEnabled) return true; document.cookie = "checkCookie=yes"; var cookieSet = document.cookie; if(cookieSet.indexOf("checkCookie=yes") > -1) cookie_enable = true; document.cookie = ""; return cookie_enable; }phpZF.unableCookieShareSession = function() { //在关闭Cookie的情况下使用session alert('对不起,您的浏览器Cookie功能禁用,请开启'); var session_id = '<?php echo $session_id;?>'; var parms=new RegExp("[?]"); if(session_id == 0){ var newURL = document.URL + '?CookieUnable=1'; if(parms.exec(document.URL) !== null) newURL = document.URL + '&CookieUnable=1'; window.location.href = newURL; }else{ var share_Session = document.getElementById('phpZF_share_Session'); if(parms.exec(share_Session.href) !== null){ share_Session.href = share_Session.href + '&session_id='+session_id; } else { share_Session.href = share_Session.href + '?session_id='+session_id; } } }
window.onload = function(){ //这里用的是onload domready更好,要判断domready需要另写代码,回头单独写
phpZF.checkJavascriptEnable();//检查浏览器是否支持Javascript
if(!phpZF.checkCookieEnable())//检查浏览器是否支持Cookie
phpZF.unableCookieShareSession();//在不支持Cookie的情况下处理session问题
}

</script>
</head>
<body> <div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript</h1></div> <div> <a id="phpZF_share_Session" href="show.php">Server Session Information</a>; </div> </body> </html>

show.php Code

<?php
if(isset($_GET['session_id'])){
header("Content-type:text/html;charset=UTF-8");
$file_name = $_GET['session_id'].'.txt';
if(file_exists($file_name)){
$Session = unserialize(file_get_contents($file_name));
echo '<pre>关闭Cookie下';
print_r($Session);
}
}else{
session_start();
header("Content-type:text/html;charset=UTF-8");
echo '<pre>开启Cookie下';
print_r($_SESSION);
}

Session 存储文件内容 我这里序列化了数组保存

a:1:{s:7:"session";s:7:"session";}

基本上就这些,哈哈虽然有点凌乱但是终于解决了,以前一直拖,拖着不是个事,早晚要解决,就算到一点嘿嘿值得滴!

结果是这样滴:作为参考

图一:















本文出自 “web开发之php” 博客,请务必保留此出处/article/4319826.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: