文档章节

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

random123
 random123
发布于 2014/06/23 20:05
字数 932
阅读 179
收藏 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
Mac中Rest服务器安装和配置(codeIgniter+rest server)

安装 codeIgniter,安装方法(http://codeigniter.org.cn/user_guide/installation/index.html),注意保证 codeIgniter 文件夹中的 index.php 放入 /Library/WebServer/Documents/ 中(根目......

zhmsong
2013/05/19
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
6
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
4
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部