一个超感人的故事:关于swfupload在某些环境下面session丢失的完美解决方案(看完我哭了)
2013-05-08 10:00
603 查看
标题吸引到你了吗?
先说一下这个问题形成的原因。大家都知道 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
附代码:
其实 关于session这一块可以单独的封装成一个函数包括session的新增 验证 删除 和获取
都可以封装成一个函数
首先在配置文件里面 设置session_id 的配置文件 然后在session 函数里面验证
这样 分离了业务逻辑 对于项目来说 扩张性提高了很多
附session函数 (thinkphp提供)
先说一下这个问题形成的原因。大家都知道 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
附代码:
// 重塑Session (必须位于session_start()之前) if (isset($_POST['PHPSESSID'])) { session_id($_POST['PHPSESSID']); } session_start();但是 直接写在项目里面 并不是特别的理想 而且大大降低了项目的可扩展性 和耦合性
其实 关于session这一块可以单独的封装成一个函数包括session的新增 验证 删除 和获取
都可以封装成一个函数
首先在配置文件里面 设置session_id 的配置文件 然后在session 函数里面验证
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提供)
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;
}
}
}
相关文章推荐
- 函数项目一个超感人的故事:关于swfupload在某些环境下面session丢失的完美解决方案(看完我哭了)
- 关于使用SpringSecurity不能设置Session并发无效、剔除前一个用户无效的核心解决方案
- 一个真实的感人故事:看完它,你会泪流满面....
- 关于asp.net Session丢失解决方案
- 【摘取】敏捷测试,用户故事:一个关于“删除购物车中的某些商品”的故事评估的实例
- 【同一个Server Weblogic两个Domain CookieName冲突导致session失效问题】【关于WebLogic的Session丢失的问题】
- 重写页面基类(判断丢失Session)-保证不丢失VIEWSATE-完美解决方案
- [置顶] 关于虚函数的一个有趣的故事跟大家分享下。
- 关于右键菜单 不好用的一个解决方案
- 关于asp.net Session丢失问题的总结
- Linux系统环境下关于多进程并发写同一个文件的讨论
- .NET委托:一个关于C#的睡前故事
- ASP.NET技巧:Session丢失原因与解决方案小结
- 子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,关于触发器SQL语句,完美解决
- 关于Session值丢失问题
- 关于.NET解决方案批生成的一点探索(同一个解决方案下多项目批生成)
- IE浏览器跨域访问iframe 中 Cookie/Session丢失解决方案
- 关于ajax应用中session过期问题的几个解决方案
- ASP.NET Session丢失问题原因及解决方案
- .NET委托:一个关于C#的睡前故事 【转】