CodeIgniter + uploadify 在 IE 下会话丢失问题的解决方案
2014-06-23 20:05
633 查看
最近需要学习并用CodeIgniter框架对一个项目进行二次开发,由于之前一直都是使用Symfony做项目,所以再换到CodeIgniter项目上还是比较顺畅的。不过相比较之下,感觉CodeIgniter比Symfony要轻量很多,当然这不是本文的讨论点。接下来会将我遇到的问题描述出来并给出最终的解决方案,希望能帮助到和我遇到同样问题的朋友。
在项目开发中需要用到文件上传的功能,这边前端是使用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类相关代码截图如下:
![](http://static.oschina.net/uploads/space/2014/0623/190617_Tp86_1860947.jpg)
其次是因为诸如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”这个错误。
既然升级flash无果,我们就想办法让服务器在session判空之前将flash产生的user-agent hack掉,跳过验证即可。相关代码截图如下:
![](http://static.oschina.net/uploads/space/2014/0623/195214_ptPK_1860947.jpg)
最后不难发现造成IE 下 CodeIgniter + uploadify 出现会话丢失的根本原因,是flash插件产生的user-agent与用户使用的浏览器user-agent不同导致CodeIgniter在验证时不通过至此出现用户会话丢失的现象。
在项目开发中需要用到文件上传的功能,这边前端是使用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类相关代码截图如下:
![](http://static.oschina.net/uploads/space/2014/0623/190617_Tp86_1860947.jpg)
其次是因为诸如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”这个错误。
既然升级flash无果,我们就想办法让服务器在session判空之前将flash产生的user-agent hack掉,跳过验证即可。相关代码截图如下:
![](http://static.oschina.net/uploads/space/2014/0623/195214_ptPK_1860947.jpg)
最后不难发现造成IE 下 CodeIgniter + uploadify 出现会话丢失的根本原因,是flash插件产生的user-agent与用户使用的浏览器user-agent不同导致CodeIgniter在验证时不通过至此出现用户会话丢失的现象。
相关文章推荐
- 解决php uploadify上传文件时session丢失的问题
- windows2003中IIS6的session以及application在iframe中丢失问题的解决方案
- ASP.NET 2.0 TEXTBOX 只读后提交数据丢失问题!解决方案!
- 关于在IE下打印页面背景图片和背景颜色丢失的解决方案
- ASP.NET Session丢失问题原因及解决方案
- ASP.NET Session丢失问题原因及解决方案
- IE中用window.open() 新开页面,有时会丢失Session 的问题。
- IE Cookie丢失问题的常见原因
- [Web开发] IE Cookie丢失问题的常见原因
- ASP.NET Session丢失问题原因及解决方案
- 关于xp+ie7下,执行confirm会出现点击取消也执行submit的问题解决方案
- commons fileupload 文件上传乱码问题解决方案 + request.getParameter无法得到参数问题
- Session丢失问题解决方案
- ASP.NET Session丢失问题原因及解决方案
- 对于ASP.net 2.0上传文件后session丢失问题的解决方案
- 修复迅雷在 IE 等浏览器中右键菜单丢失或失效的问题
- windows2003中IIS6的session以及application在iframe中丢失问题的解决方案
- uploadify scriptData参数无法传参的问题
- IE中用window.open() 新开页面,有时会丢失Session 的问题
- [Web开发] IE Cookie丢失问题的常见原因