来自Apple developer faq
Safari拥有保守派 限制cookie的cookie策略 仅写入所选页面 (“导航到”)用户。
默认情况下,Safari仅允许您直接导航到的网站的Cookie。 (即如果您点击带有该域名网址的链接)。
这意味着如果您从自己的网站加载一个页面,其中iFrame包含来自其他网站的页面,则另一个网站无法设置Cookie。 (例如,售票处)。一旦您直接访问了其他域,另一个站点就能够访问和更改自己的cookie。
如果无法访问其他网站上的代码,我怎样才能使用户体验尽可能不引人注目呢?
是否有(javascript?)方式检查其他网站的Cookie 已设置,因此,如果需要,首先显示与其他网站的直接链接?
更新
HTML5功能'window.postmessage'似乎是一个很好的解决方案 有一些jQuery库可能会有所帮助,并且与最新的浏览器兼容 本质上,iFrame文档通过窗口元素与Json一起发送消息。
非常好的Postmessage-plugin,由daepark,我开始工作。
另一个jQuery postMessage,我发现Ben Alman,但没有经过测试。
答案 0 :(得分:10)
答案 1 :(得分:8)
这是一个称为同源政策的问题。从本质上讲,它是一种防范创建安全漏洞的安全措施。
当您的iframe指向您自己域中的网页时,JavaScript可以同时访问您所在的网页和Iframe中的网页。这是孩子和孩子与父母关系的可接受的父母。
(parent doc) (iframe doc)
HTML --> IFRAME <-- HTML
^--------|---------^
但是,一旦你有一个指向外部页面的文件,SOP就会起作用,并且会在父页面和iframe页面之间传递任何信息。
(parent doc) (iframe doc)
HTML --> IFRAME <-- HTML
X
查看这篇关于iframe通讯的帖子,这很有道理! Stackoverflow post
这些链接也非常有用!
1) Secure Cross-Domain Communication in the Browser
2) wiki SOP or Same Origin Policy
答案 2 :(得分:3)
This page建议您在网页中放置一些javascript,以检测是否存在始终存在的Cookie。当它发现尚未设置cookie时,它会将所需的会话数据发布到设置cookie的页面,并将您重定向回原始页面。
显然,POST足以满足Safari的'我导航到此域'测试,因此从那时起它接受来自该域的cookie。
当然,这不是最好的代码,但很可能解决你的问题。
答案 3 :(得分:2)
一个解决方案(有点凌乱)可能是让父页面检查是否存在cookie,如果cookie不存在,则对iframe页面的域上的脚本进行AJAX调用,该域设置cookie。
答案 4 :(得分:2)
这是Safari中显示的Facebook应用程序的常见问题。许多人(包括我自己)处理这个问题的方法是将iframed页面POST给自己。当页面发布表单数据时,则允许设置cookie。最后,它可以使用1页刷新,甚至可以是您的用户登录POST。