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(),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(),120))) { if($this->CI->input->user_agent() != 'Shockwave Flash'){ $this->sess_destroy(); return FALSE; } } 就搞定啦! PS:我的swfupload初始化 ?setting 对象里面是把这行删掉的: post_params: {"PHPSESSID" : ""},不清楚会不会有影响,如果测试不成功的也把这样删掉吧 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |