一个超感人的故事:关于swfupload在某些环境下面session丢失...
时间:2013-05-08
来源:互联网
一个超感人的故事:关于swfupload在某些环境下面session丢失的完美解决方案(看完我哭了)
文章是我上午发布在博客里面的 博客地址 http://blog.csdn.net/ebw123
先说一下这个问题形成的原因。大家都知道 session是靠cookie中的session_id来传递的,但是 swfupload是靠flash来上传的。 flash并不会把非IE浏览器下面当前页面cookie发送到目标页面 这样由于当前页面的cookie不会传递给flash请求的目标地址 因此请求的文件发送到目标地址就是一个新的session了 当然这个session就没有意义了
但是经过我本人测试 这个BUG主要还是和客户安装的FLASH版本也有关,比如我昨天在win7 64位系统 最新版本flash下面就没有这个问题
目前来讲用swfupload也好久了 以前用的时候 遇到session丢失的问题 基本上 都是在项目action的页面上判断 直接判断post传值过来的 session_id 如果有的话就赋值给session
附代码:
[php] view plaincopy
- // 重塑Session (必须位于session_start()之前)
- if (isset($_POST['PHPSESSID'])) {
- session_id($_POST['PHPSESSID']);
- }
- session_start();
但是 直接写在项目里面 并不是特别的理想 而且大大降低了项目的可扩展性 和耦合性
其实 关于session这一块可以单独的封装成一个函数包括session的新增 验证 删除 和获取 都可以封装成一个函数
首先在配置文件里面 设置session_id 的配置文件 然后在session 函数里面验证
[php] view plaincopy
- if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){
- session_id($_REQUEST[C('VAR_SESSION_ID')]);
- }elseif(isset($name['id'])) {
- session_id($name['id']);
- }
- ini_set('session.auto_start', 0);
这样直接写在session函数里面 就可以很完美的获取post的session了 最后关闭php自动开启session 改为自己手动开启
这样 分离了业务逻辑 对于项目来说 扩张性提高了很多
附session函数 (thinkphp提供)
[php] view plaincopy
- function session($name,$value='') {
- $prefix = C('SESSION_PREFIX');
- if(is_array($name)) { // session初始化 在session_start 之前调用
- if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);
- if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){
- session_id($_REQUEST[C('VAR_SESSION_ID')]);
- }elseif(isset($name['id'])) {
- session_id($name['id']);
- }
- ini_set('session.auto_start', 0);
- if(isset($name['name'])) session_name($name['name']);
- if(isset($name['path'])) session_save_path($name['path']);
- if(isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']);
- if(isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']);
- if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0);
- if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0);
- if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']);
- if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']);
- if(isset($name['type'])) C('SESSION_TYPE',$name['type']);
- if(C('SESSION_TYPE')) { // 读取session驱动
- $class = 'Session'. ucwords(strtolower(C('SESSION_TYPE')));
- // 检查驱动类
- if(require_cache(EXTEND_PATH.'Driver/Session/'.$class.'.class.php')) {
- $hander = new $class();
- $hander->execute();
- }else {
- // 类没有定义
- throw_exception(L('_CLASS_NOT_EXIST_').': ' . $class);
- }
- }
- // 启动session
- if(C('SESSION_AUTO_START')) session_start();
- }elseif('' === $value){
- if(0===strpos($name,'[')) { // session 操作
- if('[pause]'==$name){ // 暂停session
- session_write_close();
- }elseif('[start]'==$name){ // 启动session
- session_start();
- }elseif('[destroy]'==$name){ // 销毁session
- $_SESSION = array();
- session_unset();
- session_destroy();
- }elseif('[regenerate]'==$name){ // 重新生成id
- session_regenerate_id();
- }
- }elseif(0===strpos($name,'?')){ // 检查session
- $name = substr($name,1);
- if($prefix) {
- return isset($_SESSION[$prefix][$name]);
- }else{
- return isset($_SESSION[$name]);
- }
- }elseif(is_null($name)){ // 清空session
- if($prefix) {
- unset($_SESSION[$prefix]);
- }else{
- $_SESSION = array();
- }
- }elseif($prefix){ // 获取session
- return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;
- }else{
- return isset($_SESSION[$name])?$_SESSION[$name]:null;
- }
- }elseif(is_null($value)){ // 删除session
- if($prefix){
- unset($_SESSION[$prefix][$name]);
- }else{
- unset($_SESSION[$name]);
- }
- }else{ // 设置session
- if($prefix){
- if (!is_array($_SESSION[$prefix])) {
- $_SESSION[$prefix] = array();
- }
- $_SESSION[$prefix][$name] = $value;
- }else{
- $_SESSION[$name] = $value;
- }
- }
- }
-
作者: ebw123 发布时间: 2013-05-08
作者: qxhy123 发布时间: 2013-05-09
作者: 大水车 发布时间: 2013-05-09

作者: Frank_Luo 发布时间: 2013-05-13
作者: tiantian_1 发布时间: 2013-05-17
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28