当前位置:编程学习 > C#/ASP.NET >>

如何使用iframe实现跨域写入cookie 并且兼容大部分浏览器

最近在做单点登录的时候需要使用iframe来实现跨域写入cookie,此功能在chrome,ff中测试均可以通过,但是在ie中却异常不稳定,尤其在ie8(因为电脑上暂时没有ie6,7的测试环境)中,后来发现是由于ie的安全机制引起的,对iframe跨域写入的cookie不信任,导致无法读取

在查资料的时候查看到了这篇文章http://www.iteye.com/problems/81543

但是按照上面的方法做了之后还是会经常不稳定,出问题,问问各位有没有做过类似iframe跨域写入cookie 兼容全部浏览器的,
最高300全丢了
--------------------编程问答-------------------- 假如
在网站www.A.com下通过iframe或ajax调用www.B.com下的内容时,默认情况下IE会阻止www.B.com写任何Cookie
//www.B.com里的被调用的页面需要写P3P头,从而解除IE对写Cookie的阻止 
context.Response.AddHeader("P3P", "CP=CAO PSA OUR"); 

//www.A.com里通过ajax调用www.B.com里的内容时,是跨域访问,需要使用jsonp,为配合其工作需要添加下面两句,生成jsonp返回 
context.Response.ContentType = "text/plain"; 
context.Response.Write(string.Format("{0}('OK')", context.Request["callback"])); 


//jsonp调用进行跨域访问 
jQuery.ajax({ 
url: url, 
type: 'GET', 
data: data, 
dataType: 'jsonp', 
success: function (data) { 
window.location.href = toURL; 

}); 
--------------------编程问答--------------------
当页面存在iframe时,想要获取iframe框架里面的cookie,就要在iframe相应的动态页面里添加P3P Header信息,否则在IE下获取不到。因为IE有安全策略,限制頁面不保存第三方cookie(注:当前访问页面为第一方cookie,第三方cookie就是当前网页以外的其他网页的cookie)。 --------------------编程问答--------------------
引用 1 楼 Chinajiyong 的回复:
假如
在网站www.A.com下通过iframe或ajax调用www.B.com下的内容时,默认情况下IE会阻止www.B.com写任何Cookie
//www.B.com里的被调用的页面需要写P3P头,从而解除IE对写Cookie的阻止 
context.Response.AddHeader("P3P", "CP=CAO PSA OUR"); 

//www.A.com里通过ajax调用www.B.com里的内容时,是跨域访问,需要使用jsonp,为配合其工作需要添加下面两句,生成jsonp返回 
context.Response.ContentType = "text/plain"; 
context.Response.Write(string.Format("{0}('OK')", context.Request["callback"])); 


//jsonp调用进行跨域访问 
jQuery.ajax({ 
url: url, 
type: 'GET', 
data: data, 
dataType: 'jsonp', 
success: function (data) { 
window.location.href = toURL; 

}); 


ie8里面貌似不认这个p3p的头部的,帖子链接的文件里面提到了XDomainRequestAllowed设置为1 这个,但是我设置了在ie8中还不是不管用
--------------------编程问答-------------------- 通过在代码上加
Response.AddHeader("P3P", "CP=CAO PSA OUR");

或者在Window服务中将ASP.NET State Service 启动。 --------------------编程问答-------------------- context.Response.AddHeader("P3P", "CP=CAO PSA OUR"); 
--------------------编程问答--------------------
引用 4 楼 Chinajiyong 的回复:
通过在代码上加
Response.AddHeader("P3P", "CP=CAO PSA OUR");

或者在Window服务中将ASP.NET State Service 启动。


 不知道版主你亲自实验过了没,至少我加上
p3p的头部在ie8浏览器上测试还不是行的哦,
我查看资料说P3p是支持6,7版本的,ie8并不支持呢。。。

补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,