CI跟swfupload结合 出现302的解决方案

出现 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" : ""},

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值