+ -
当前位置:首页 → 问答吧 → 一个超感人的故事:关于swfupload在某些环境下面session丢失...

一个超感人的故事:关于swfupload在某些环境下面session丢失...

时间:2013-05-08

来源:互联网

本帖最后由 ebw123 于 2013-5-8 16:29 编辑

一个超感人的故事:关于swfupload在某些环境下面session丢失的完美解决方案(看完我哭了)

文章是我上午发布在博客里面的  博客地址 http://blog.csdn.net/ebw123



先说一下这个问题形成的原因。大家都知道  session是靠cookie中的session_id来传递的,但是 swfupload是靠flash来上传的。 flash并不会把非IE浏览器下面当前页面cookie发送到目标页面 这样由于当前页面的cookie不会传递给flash请求的目标地址 因此请求的文件发送到目标地址就是一个新的session了 当然这个session就没有意义了


但是经过我本人测试  这个BUG主要还是和客户安装的FLASH版本也有关,比如我昨天在win7 64位系统  最新版本flash下面就没有这个问题


目前来讲用swfupload也好久了 以前用的时候 遇到session丢失的问题  基本上 都是在项目action的页面上判断  直接判断post传值过来的 session_id  如果有的话就赋值给session


附代码:


[php] view plaincopy


  • // 重塑Session (必须位于session_start()之前)  
  • if (isset($_POST['PHPSESSID'])) {  
  •     session_id($_POST['PHPSESSID']);  
  • }  
  • session_start();  

但是 直接写在项目里面  并不是特别的理想 而且大大降低了项目的可扩展性 和耦合性  

其实  关于session这一块可以单独的封装成一个函数包括session的新增 验证 删除 和获取 都可以封装成一个函数  

首先在配置文件里面 设置session_id 的配置文件  然后在session 函数里面验证



[php] view plaincopy


  • if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){  
  •             session_id($_REQUEST[C('VAR_SESSION_ID')]);  
  •         }elseif(isset($name['id'])) {  
  •             session_id($name['id']);  
  •         }  
  •         ini_set('session.auto_start', 0);  

这样直接写在session函数里面  就可以很完美的获取post的session了  最后关闭php自动开启session  改为自己手动开启

这样 分离了业务逻辑  对于项目来说 扩张性提高了很多


附session函数  (thinkphp提供)


[php] view plaincopy


  • function session($name,$value='') {  
  •     $prefix   =  C('SESSION_PREFIX');  
  •     if(is_array($name)) { // session初始化 在session_start 之前调用  
  •         if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);  
  •         if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){  
  •             session_id($_REQUEST[C('VAR_SESSION_ID')]);  
  •         }elseif(isset($name['id'])) {  
  •             session_id($name['id']);  
  •         }  
  •         ini_set('session.auto_start', 0);  
  •         if(isset($name['name']))            session_name($name['name']);  
  •         if(isset($name['path']))            session_save_path($name['path']);  
  •         if(isset($name['domain']))          ini_set('session.cookie_domain', $name['domain']);  
  •         if(isset($name['expire']))          ini_set('session.gc_maxlifetime', $name['expire']);  
  •         if(isset($name['use_trans_sid']))   ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0);  
  •         if(isset($name['use_cookies']))     ini_set('session.use_cookies', $name['use_cookies']?1:0);  
  •         if(isset($name['cache_limiter']))   session_cache_limiter($name['cache_limiter']);  
  •         if(isset($name['cache_expire']))    session_cache_expire($name['cache_expire']);  
  •         if(isset($name['type']))            C('SESSION_TYPE',$name['type']);  
  •         if(C('SESSION_TYPE')) { // 读取session驱动  
  •             $class      = 'Session'. ucwords(strtolower(C('SESSION_TYPE')));  
  •             // 检查驱动类  
  •             if(require_cache(EXTEND_PATH.'Driver/Session/'.$class.'.class.php')) {  
  •                 $hander = new $class();  
  •                 $hander->execute();  
  •             }else {  
  •                 // 类没有定义  
  •                 throw_exception(L('_CLASS_NOT_EXIST_').': ' . $class);  
  •             }  
  •         }  
  •         // 启动session  
  •         if(C('SESSION_AUTO_START'))  session_start();  
  •     }elseif('' === $value){   
  •         if(0===strpos($name,'[')) { // session 操作  
  •             if('[pause]'==$name){ // 暂停session  
  •                 session_write_close();  
  •             }elseif('[start]'==$name){ // 启动session  
  •                 session_start();  
  •             }elseif('[destroy]'==$name){ // 销毁session  
  •                 $_SESSION =  array();  
  •                 session_unset();  
  •                 session_destroy();  
  •             }elseif('[regenerate]'==$name){ // 重新生成id  
  •                 session_regenerate_id();  
  •             }  
  •         }elseif(0===strpos($name,'?')){ // 检查session  
  •             $name   =  substr($name,1);  
  •             if($prefix) {  
  •                 return isset($_SESSION[$prefix][$name]);  
  •             }else{  
  •                 return isset($_SESSION[$name]);  
  •             }  
  •         }elseif(is_null($name)){ // 清空session  
  •             if($prefix) {  
  •                 unset($_SESSION[$prefix]);  
  •             }else{  
  •                 $_SESSION = array();  
  •             }  
  •         }elseif($prefix){ // 获取session  
  •             return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;  
  •         }else{  
  •             return isset($_SESSION[$name])?$_SESSION[$name]:null;  
  •         }  
  •     }elseif(is_null($value)){ // 删除session  
  •         if($prefix){  
  •             unset($_SESSION[$prefix][$name]);  
  •         }else{  
  •             unset($_SESSION[$name]);  
  •         }  
  •     }else{ // 设置session  
  •         if($prefix){  
  •             if (!is_array($_SESSION[$prefix])) {  
  •                 $_SESSION[$prefix] = array();  
  •             }  
  •             $_SESSION[$prefix][$name]   =  $value;  
  •         }else{  
  •             $_SESSION[$name]  =  $value;  
  •         }  
  •     }  
  • }  



作者: ebw123   发布时间: 2013-05-08

好感人...

作者: qxhy123   发布时间: 2013-05-09

我靠,这样也可以?

作者: 大水车   发布时间: 2013-05-09

哈哈 学习了额 呵呵

作者: Frank_Luo   发布时间: 2013-05-13

{:soso_e102:},头晕了啊

作者: tiantian_1   发布时间: 2013-05-17