82

我在浏览 Facebook 的有关画布应用程序的文档时遇到了一个示例应用程序:http: //developers.facebook.com/docs/samples/canvas。然而,当我阅读他们的示例时,我对他们在 iframe 应用程序中使用 cookie 感到非常困惑。

一点背景故事...

我已经尝试过将 iframe 用于可嵌入小部件(与 Facebook 无关),并且我发现一些浏览器(Chrome、Safari 等)具有严格的 cookie 策略并且不允许在 iframe 中设置跨域 cookie(Firefox、另一方面,允许 iframe 在 iframe 中设置跨域 cookie)。例如,如果 foo.com 有一个带有src="http://bar.com/widget"iframe 小部件的 iframe,则将无法为 bar.com 设置任何 cookie,因此在 iframe 中保持状态会遇到问题:bar.com 将解释来自的每个请求(包括 ajax 请求)小部件作为没有建立会话的新请求。我苦苦挣扎,并通过使用 JSONP 和 javascript 为 foo.com 设置 cookie 找到了解决方法......

... 所以?

好吧,我正在查看示例画布 iframe Facebook 应用程序,我注意到他们的应用程序(托管在 runwithfriends.appspot.com 上)能够设置一个 cookie,u其中包含当前用户的 id 以及 runwithfriends 的一些其他参数。 apppot.com 域。它会随每个请求发送此 cookie……它适用于 Chrome 和 Firefox!怎么回事?Facebook 如何绕过 Chrome 上的跨域 cookie 限制?

(我现在已经知道答案了,但我认为这可能对任何努力找出相同问题的人有所帮助——我将在下面发布答案。)

4

1 回答 1

87

所以 iFrame 实际上并没有u为 runwithfriends.appspot.com 域设置 cookie。Facebook 所做的是创建一个表单,<form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST">并使用 javascript 在页面加载时提交表单。由于表单的目标是 iframe,它不会重新加载页面......它只是加载带有 POST 响应的 iframe。显然,即使是具有严格 cookie 策略的 Chrome 和其他浏览器也会为跨域请求设置 cookie,如果它们是 POST 请求...

于 2011-01-15T21:00:13.670 回答