加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:09:30 所属栏目:百科 来源:网络整理
导读:标题吸引到你了吗? 先说一下这个问题形成的原因。大家都知道 ?session是靠cookie中的session_id来传递的,但是 swfupload是靠flash来上传的。 flash并不会把非IE浏览器下面当前页面cookie发送到目标页面 这样由于当前页面的cookie不会传递给flash请求的目标

标题吸引到你了吗?


先说一下这个问题形成的原因。大家都知道 ?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


附代码:

// 重塑Session (必须位于session_start()之前)
if (isset($_POST['PHPSESSID'])) {
    session_id($_POST['PHPSESSID']);
}
session_start();
但是 直接写在项目里面 ?并不是特别的理想 而且大大降低了项目的可扩展性 和耦合性 ?


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

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


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提供)

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;
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读