• 初始化提交CI跟swfupload结合 出现302的解决方案


    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

        涌现 302 多数是因为 flash 插件不会使用 ie的cookie, 所以登陆的 hook 没法还原 sessionid 导致CI以为没有登陆,形成 redirect到 Login yemian de  302

        曾有人写过一篇文章http://www.shirne.com/?cid=17&id=145 但是我照他的方法,虽然很有帮助但是还是没法搞定,于是自己研讨了,以下是解决方案:

        前提:你使用的是 CI的session而不是 php 自带的 session

        1. 首先去官网下载最新版的 swfupload  里头有一个swfupload.cookies.js,导入到页面中,并在初始化swfupload以后跟上一句 refreshCookies,看起来是这样的:

    swfu = new SWFUpload(settings);
        swfu.refreshCookies();

        2. 这样提交的时候会把 cookie的东西放到post里头去提交,所以我们在 ci 自己写的权限钩子里头获取这个玩意:

    $CI =& get_instance();
            if($CI->input->post('ci_session') !== false){
                //如果使用swfupload只能采用 post 将 ci_session 传给ci
                $ci_session = urldecode($CI->input->post('ci_session'));
                $cookie = array(
                    'name'   => 'ci_session',
                    'value'  => $ci_session,
                    'expire' => '86500'
                );
                $CI->input->set_cookie($cookie);
            }
            $CI->load->library('session');
        每日一道理
    如果说友谊是一颗常青树,那么,浇灌它的必定是出自心田的清泉;如果说友谊是一朵开不败的鲜花,那么,照耀它的必定是从心中升起的太阳。 多少笑声都是友谊唤起的,多少眼泪都是友谊揩干的。友谊的港湾温情脉脉,友谊的清风灌满征帆。友谊不是感情的投资,它不需要股息和分红。(友谊可以换其他词语)

        注意:我们是在 load session 之前干这个事情的,并且autoload 里头不能有session 不然的话 session 的加载会比你这个钩子还早

        3. 光这样还不行,ci会比较  user-agent 如果不相符就会把 session 干失落,虽然关闭失落这个校验也可以,但是会有安全隐患,我们索性改下 ci 源码,让ci碰到flash的user-agent 才放行

        打开 Session.php 找到这段:

    // Does the User Agent Match?
    		if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 120)))
    		{
    			$this->sess_destroy();
    			return FALSE;
    		}

        在里头增加一段话变为这样:

    // Does the User Agent Match?
    		if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 120)))
    		{
                if($this->CI->input->user_agent() != 'Shockwave Flash'){
                    $this->sess_destroy();
                    return FALSE;
                }
    		}

        就搞定啦!

        

        PS:我的swfupload初始化  setting 对象里头是把这行删失落的:

    post_params: {"PHPSESSID" : ""},

        不清楚会不会有影响,如果测试不成功的也把这样删失落吧

        

        

        

    文章结束给大家分享下程序员的一些笑话语录: 那是习惯决定的,一直保持一个习惯是不好的!IE6的用户不习惯多标签,但是最终肯定还是得转到多标签的浏览器。历史(软件UI)的进步(改善)不是以个人意志(习惯)为转移的!

  • 相关阅读:
    C++我们必须要熟悉的事之具体做法(3)——类的设计与声明
    C++我们必须要了解的事之具体做法(1)——构造、复制构造、析构、赋值操作符背后的故事
    STL hash table, Unordered Contains
    多个生产者——多个消费者模型(互斥量条件变量实现)
    将UNIX网络编程卷2的库函数合并到卷1的库函数中
    进程间通信(三)——Posix共享内存区
    进程间同步(1)——条件变量和互斥量
    进程间通信(二)——Posix消息队列
    python使用百度翻译api
    screen命令
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3093449.html
Copyright © 2020-2023  润新知