文档章节

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

random123
 random123
发布于 2014/06/23 20:05
字数 932
阅读 181
收藏 2

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

      

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

     

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

    

© 著作权归作者所有

共有 人打赏支持
random123
粉丝 0
博文 1
码字总数 932
作品 0
合肥
程序员
私信 提问
CodeIgniter3.0项目推荐

权限系统 https://github.com/benedmunds/CodeIgniter-Ion-Auth 国际化 https://github.com/bcit-ci/codeigniter3-translations session存储库 https://github.com/cnsaturn/codeigniter-my......

果树啊
2015/03/13
0
1
CodeIgniter 框架分析

入口文件 入口文件主要完成下列工作: 1) 指定 CodeIgniter 框架所在目录; 2) 定义 APPPATH 常量,指示应用程序文件根目录; 3) 载入 codeigniter/CodeIgniter.php 文件,启动框架。 codeig...

那些年我们一起
2012/08/10
0
17
Codeigniter中禁止A Database Error Occurred及A PHP E...

目录(?)[-] Codeigniter中禁止A Database Error Occurred错误提示 Codeigniter中禁止A PHP Error was encountered错误提示 页面出现如下两种错误提示: A PHP Error was encountered Severi...

Taki
2013/04/03
0
0
实战jQuery和PHP CodeIgniter表单验证

前言   在Web建站中,表单的合法性验证是十分重要的一个环节,其中包括客户端浏览器的Javascript的验证和服务端的验证。在本文中将指导读者使用jQuery中的validate验证框架实现浏览器端的验...

彼得
2014/03/08
0
0
CodeIgniter 4 alpha 1 版发布了,PHP 框架

经过漫长的艰苦奋斗,CodeIgnier 4.0.0 alpha 1 版今天终于发布了。 向 Lonnie Ezell 致敬!感谢他为实现愿景和核心实施所做的所有努力! 这是 4.0.0 的早期预发行版,它不适合生产环境! 你...

CodeIgniter
09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Go 使用channel控制并发

前言 channel一般用于协程之间的通信,channel也可以用于并发控制。比如主协程启动N个子协程,主协程等待所有子协程退出后再继续后续流程,这种场景下channel也可轻易实现。 场景示例 总结 ...

恋恋美食
40分钟前
1
0
Apache Flink 漫谈系列 - 持续查询(Continuous Queries)

摘要: 实际问题 我们知道在流计算场景中,数据是源源不断的流入的,数据流永远不会结束,那么计算就永远不会结束,如果计算永远不会结束的话,那么计算结果何时输出呢?本篇将介绍Apache Fl...

阿里云官方博客
43分钟前
11
0
斐波那契堆的理解,节点mark属性和势函数

斐波那契堆 看了好多博客,都是照搬算法导论的内容,没有自己的理解,比如为什么有mark属性,势函数的作用,以及为什么叫斐波那契堆,下面说说鄙人的理解。 势函数 势函数是根节点个数加上2...

杨喆
44分钟前
4
0
NIO源码详解

阻塞io和无阻塞io: 阻塞io是指jdk1.4之前版本面向流的io,服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒 ...

沉稳2018
49分钟前
1
0
如何把已经提交的commit, 从一个分支放到另一个分支

在本地master提交了一个commit(8d85d4bca680a5dbcc3e5cfb3096d18cd510cc9f),如何提交的test_2分之上? git checkout test_2git cherry-pick 8d85d4bca680a5dbcc3e5cfb3096d18cd510cc9f......

stephen_wu
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部