CodeIgniter + uploadify 在 IE 下会话丢失问题的解决方案

      最近需要学习并用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类相关代码截图如下:

      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掉,跳过验证即可。相关代码截图如下:

     195214_ptPK_1860947.jpg

       最后不难发现造成IE 下 CodeIgniter + uploadify 出现会话丢失的根本原因,是flash插件产生的user-agent与用户使用的浏览器user-agent不同导致CodeIgniter在验证时不通过至此出现用户会话丢失的现象。

    

转载于:https://my.oschina.net/random123/blog/283221

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值