我正在浏览 Facebook 的文档,阅读有关画布应用程序的内容,并发现了一个示例应用程序:http://developers.facebook.com/docs/samples/canvas。然而,当我阅读他们的示例时,我对他们在 iframe 应用程序中使用 cookie 感到非常困惑。
一点背景故事...
我已经尝试过使用 iframe 来实现可嵌入小部件(与 Facebook 无关),并且我发现一些浏览器(Chrome、Safari 等)具有严格的 cookie 策略,并且不允许在 iframe 中设置跨域 cookie(Firefox、另一方面,允许 iframe 在 iframe 中设置跨域 cookie)。例如,如果 foo.com 有一个 iframesrc="http://bar.com/widget"
iframe 小部件将无法为 bar.com 设置任何 cookie,因此在 iframe 中持久保存状态会遇到问题:bar.com 会将来自小部件的每个请求(包括 ajax 请求)解释为没有建立会话的新请求。我苦苦挣扎,找到了解决这个问题的方法,即使用 JSONP 和 javascript 为 foo.com 设置 cookie...
... 所以?
嗯,我正在查看示例 canvas iframe Facebook 应用程序,我注意到他们的应用程序(托管在 runwithfriends.appspot.com 上)能够设置 cookie,u
,以及当前用户的 ID 以及 runwithfriends.appspot.com 域的一些其他参数。它会在每次请求时发送这个 cookie...并且它在 Chrome 和 Firefox 中都可以工作!搞什么? Facebook 如何绕过 Chrome 上的跨域 cookie 限制?
(我现在已经知道答案了,但我认为这可能对那些努力找出同样问题的人有帮助——我将在下面发布答案。)
所以 iFrame 实际上并没有设置u
runwithfriends.appspot.com 域的 cookie。 Facebook 所做的是创建一个表单,<form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST">
并使用 javascript 在页面加载时提交表单。由于表单的目标是 iframe,因此它不会重新加载页面...它只是使用 POST 响应加载 iframe。显然,即使 Chrome 和其他具有严格 cookie 策略的浏览器也会为跨域请求设置 cookie(如果它们是 POST 请求)...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)