解决跨域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下隐私信息的跨域访问问题了。
参考:
2,关于PHP的header("P3P: CP=CURa……")
3,转载 php iframe 下 IE session 失效解决办法