Chinaunix首页 | 论坛 | 博客
  • 博客访问: 873637
  • 博文数量: 372
  • 博客积分: 10063
  • 博客等级: 中将
  • 技术积分: 4220
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 11:36
文章分类

全部博文(372)

文章存档

2012年(372)

分类: 系统运维

2012-03-03 14:33:29

记得刚开始接触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所以要验证下

  1. 客户端Javascript/Cookie/Session 检测
  2. "UTF-8"/>
  3. "phpZF_check_javascript_enable">

    您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript

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

第二步:检测是否支持Cookie

关键函数

  1. phpZF.checkCookieEnable = function(){//检查浏览器是否开启Cookie
  2. var cookie_enable = false;
  3. if(navigator.cookiesEnabled)
  4. return true;
  5. document.cookie = "checkCookie=yes";
  6. var cookieSet = document.cookie;
  7. if(cookieSet.indexOf("checkCookie=yes") > -1)
  8. cookie_enable = true;
  9. document.cookie = "";
  10. return cookie_enable;
  11. }

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

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

PHP接收后就会特别处理session

关键函数

Javascript

  1. phpZF.unableCookieShareSession = function() { //在关闭Cookie的情况下使用session
  2. alert('对不起,您的浏览器Cookie功能禁用,请开启');
  3. var session_id = '';
  4. var parms=new RegExp("[?]");
  5. if(session_id == 0){
  6. var newURL = document.URL + '?CookieUnable=1';
  7. if(parms.exec(document.URL) !== null)
  8. newURL = document.URL + '&CookieUnable=1';
  9. window.location.href = newURL;
  10. }else{
  11. var share_Session = document.getElementById('phpZF_share_Session');
  12. if(parms.exec(share_Session.href) !== null){
  13. share_Session.href = share_Session.href + '&session_id='+session_id;
  14. } else {
  15. share_Session.href = share_Session.href + '?session_id='+session_id;
  16. }
  17. }
  18. }

PHP

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

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

  1. <body>
  2. <div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascripth1>div>
  3. <div>
  4. <a id="phpZF_share_Session" href="show.php">Server Session Informationa>;
  5. div>
  6. body>
  7. html>

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

目录结构:

set.php //入口

show.php //共享session 查看session

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

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

set.php Code

  1. session_start();
  2. isset($_SESSION['session'])?null:$_SESSION['session']='session';
  3. if(@$_GET['CookieUnable'] == '1' ){//如果当前浏览器关闭cookie 那么重新加载
  4. $session_id = session_id(); //获取当前的session_id;
  5. $file_name = $session_id.'.txt';//这里暂时用文件保存 可以用任何的存储介质,通常为数据库这里为了讲述方法用创建文件解决
  6. $handle = fopen($file_name,'w');
  7. fwrite($handle, serialize($_SESSION));
  8. fclose($handle);
  9. }else{
  10. $session_id = 0;
  11. }
  12. ?>
  13. 客户端Javascript/Cookie/Session 检测
  14. "UTF-8"/>
  15. "phpZF_check_javascript_enable">

    您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript

  16. "phpZF_share_Session" href="show.php">Server Session Information;
  • show.php Code

    1. if(isset($_GET['session_id'])){
    2. header("Content-type:text/html;charset=UTF-8");
    3. $file_name = $_GET['session_id'].'.txt';
    4. if(file_exists($file_name)){
    5. $Session = unserialize(file_get_contents($file_name));
    6. echo '
      关闭Cookie下'; 
    7. print_r($Session);
    8. }
    9. }else{
    10. session_start();
    11. header("Content-type:text/html;charset=UTF-8");
    12. echo '
      开启Cookie下'; 
    13. print_r($_SESSION);
    14. }

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

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

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

    结果是这样滴:作为参考

    图一:

    本文出自 “web开发之php” 博客,请务必保留此出处http://phpzf.blog.51cto.com/3011675/792298

    阅读(703) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~