解决跨域POST登录中IE不能正常工作的bug

结合我的这篇blog 《简单实用的跨域表单POST提交》 文章,这篇blog中的思路是解决在www.a.com站中登录 同时要把关联站www.b.com登录状态也设置成登录状态,在a中获取登录信息传递给b。

这个在firefox和chrome下是可以正常工作的,但是在测试IE的过程中却是怎么也不能正常工作。

问题出在哪啊,折腾了好半天。这里做下记录,给自己加深记忆,也给遇到同类问题的有缘人启迪。

原因:IE的P3P协议-->

IE6/IE7从安全性角度考虑,支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存在此问题了。

这个协议阻止了iframe中是session[cookie]登录状态信息的写入和调用。导致程序不能正常工作。

解决方案:

再来回顾这篇blog《设置一个严格的SESSION过期时间

我们在session_start();之前 改写http header头信息

即在http header头文件中增加对跨域访问cookie数据的允许。

header("P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");

在网站总入口调用这个session基类,完整程序的如下:

class session_base()
{
    var $max_life_time  = 1440; // SESSION 过期时间||设为0即关闭浏览器即销毁session
    var $my_session_name = 'logonmy'
    var $session_cookie_path   = '/';//SESSION存储路径
    var $session_cookie_domain = '';//这里为空的话即为当前站点域名,也可以指定作用域名[.demo.com]
    var $session_cookie_secure = false;//一般都为false
 
 
    public function __construct()
    {
        header("P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");//这里添加p3p header
        $this->_session_base();
    }    
 
    private function _session_base()
    {
        //session_name($this->$my_session_name);//如果我们不想使用PHPSESSID作为session名称我们可以改成于本站相关或者喜欢的名称 
        session_set_cookie_params($this->$max_life_time,$this->$session_cookie_path,$this->$session_cookie_domain,$this->$session_cookie_secure);
        session_start();
    }
}

这样就可以解决IE下隐私信息的跨域访问问题了。

 

参考:

1,关于p3p 简洁策略,以及浏览器的支持情况.

2,关于PHP的header("P3P: CP=CURa……")

3,转载 php iframe 下 IE session 失效解决办法

 

posted on 2013-09-06 16:41  logon  阅读(758)  评论(0编辑  收藏  举报