zoukankan      html  css  js  c++  java
  • 函数项目一个超感人的故事:关于swfupload在某些环境下面session丢失的完美解决方案(看完我哭了)

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!

        标题吸引到你了吗?函数和项目

        

        先说一下这个题问成形的原因。大家都晓得  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;
            }
        }
    }

        

    文章结束给大家分享下程序员的一些笑话语录: 一个合格的程序员是不会写出 诸如 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去。

  • 相关阅读:
    PHP做Web开发的MVC框架(Smarty使用说明 )
    PHP + Smarty + html5 构建Wap应用
    HTML5游戏中动画帧的概念理解
    [转]jQuery选择器 (详解)
    2014马年应该有怎么样的学习方式和思考原则
    html5视频播放解决方案
    html5学习摘要
    sqlserver2008行锁
    关于一些url中传递参数有空格问题
    MongoDB和Redis区别
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3067558.html
Copyright © 2011-2022 走看看