博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeIgniter + uploadify 在 IE 下会话丢失问题的解决方案
阅读量:5997 次
发布时间:2019-06-20

本文共 1380 字,大约阅读时间需要 4 分钟。

hot3.png

      最近需要学习并用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

你可能感兴趣的文章
RedHat 5.6 安装Oracle 10.2.01
查看>>
ORA-32004解决方法
查看>>
获取安装后Apache、MySQL、Nginx、PHP编译时参数
查看>>
《大数据时代的历史机遇》读书心得
查看>>
UTC - mysqld got signal 6
查看>>
关于servlet的学习日志
查看>>
我的友情链接
查看>>
阿里云epel源
查看>>
Oracle数据库冷、热备份步骤
查看>>
mysql or 多个条件 并在一起查询,使用括号把多个or作为一个条件
查看>>
数据库乱码问题
查看>>
大数据第二天作业
查看>>
Coding and Paper Letter(三)
查看>>
阿里云安装mysql5.7
查看>>
使用apache的mod_jk实现jboss负载均衡
查看>>
windows远程ubuntu花屏
查看>>
python-11:HTTP headers是什么
查看>>
Invalid bound statement (not found) --mybatis
查看>>
LeetCode - 168. Excel表列名称
查看>>
Asp.net MVC 的一些经验
查看>>