最近须要学习并用CodeIgniter框架对一个项目进行二次开发,因为以前一直都是使用Symfony作项目,因此再换到CodeIgniter项目上仍是比较顺畅的。不过相比较之下,感受CodeIgniter比Symfony要轻量不少,固然这不是本文的讨论点。接下来会将我遇到的问题描述出来并给出最终的解决方案,但愿能帮助到和我遇到一样问题的朋友。php
在项目开发中须要用到文件上传的功能,这边前端是使用uploadify来实现文件上传功能的。在firefox完成这个功能的实现,测试并无问题一切正常。但是在 IE 下的时候,头疼的问题就来了。文件上传成功以后,用户会话却丢失了。致使用户需再次登陆,而且上一步的后续操做也没有执行(由于有权限验证,会话丢失以后验证不经过形成的)。网上搜索的结果大体都是firefox, chrome 下使用uploadify时使用了flash插件,flash中有个bug就是自身会建立一个session,这样就致使与web自己的session不一致,致使服务端权限验证失败的问题。但是我在firefox和chrome下是能够正常使用并无出错,出错的反而是在 IE。前端
后来通过一番分析找到缘由了,首先CodeIgniter框架中session使用的不是php原生的session机制而是本身的一套东西,CodeIgniter会把session保存到Cookie中,这个Cookie数组中保存的session_id也不是php 原生的session_id ,而是经过本身的规则生成的(这里也就能说明为何我在firefox、chrome中不会由于session_id丢失会话的缘由)。CodeIgniter session类相关代码截图以下:web
其次是由于诸如uploadify,swfupload采用的都是flash客户端,这样它们产生的user-agent与用户使用浏览器的 user-agent必然不一样。并且CodeIgniter在验证会话时也会将user-agent做为判断条件。若是user-agent不一致,CodeIgniter会将当前的session会话销毁,并从新生成会话,这就致使以前用户登陆的会话丢失状况。因此当用户登陆了你的系统产生了一个session,可是当触发上传程序时会产生另外一个session(在上述 user-agent选项开启的状况下)。再进一步分析发现,IE下触发上传程序flash产生的user-agent 既然是“Shockwave Flash”错误,一开始觉得是IE 下的flash版本太低致使的,后来flash升级 IE重启仍是不行,依然出现“Shockwave Flash”这个错误。chrome
既然升级flash无果,咱们就想办法让服务器在session判空以前将flash产生的user-agent hack掉,跳过验证便可。相关代码截图以下:数组
最后不难发现形成IE 下 CodeIgniter + uploadify 出现会话丢失的根本缘由,是flash插件产生的user-agent与用户使用的浏览器user-agent不一样致使CodeIgniter在验证时不经过至此出现用户会话丢失的现象。浏览器