我正在浏览Facebook关于画布应用程序的文档,我遇到了一个示例应用程序:http://developers.facebook.com/docs/samples/canvas。然而,当我阅读他们的例子时,我对他们在iframe应用程序中使用cookie感到非常困惑。
一个小故事......
我已经玩过使用iframes嵌入式小部件(与Facebook无关),我发现一些浏览器(Chrome,Safari等)有严格的cookie政策,不允许在iframe中设置跨域cookie (另一方面,Firefox允许iframe在iframe中设置跨域cookie)。例如,如果foo.com的iframe为src="http://bar.com/widget"
,iframe小部件将无法为bar.com设置任何Cookie,因此无法在iframe中保持状态:bar.com将解释每个请求(包括来自窗口小部件的ajax请求,作为没有建立会话的新请求。我挣扎了,通过使用JSONP和javascript为foo.com设置cookie来找到解决方法......
......等等?
好吧,我正在查看示例画布iframe Facebook应用程序,我注意到他们的应用程序(托管在runwithfriends.appspot.com上)能够设置一个cookie u
,其中包含当前用户的id以及runwithfriends.appspot.com域的一些其他参数。它会在每个请求中发送此cookie ...它可以在Chrome和Firefox中运行! WTF? Facebook如何解决Chrome上的跨域cookie限制?
(我现在已经知道了答案,但我认为这可能对那些努力想出同样事情的人有所帮助 - 我将在下面发布答案。)
答案 0 :(得分:65)
因此iFrame实际上并没有为runwithfriends.appspot.com域设置u
cookie。 Facebook所做的是创建一个表单<form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST">
并使用javascript在页面加载时提交表单。由于表单的目标是iframe,因此它不会重新加载页面...它只是使用POST的响应加载iframe。显然,即使是Chrome和其他具有严格Cookie政策的浏览器,如果它们是POST请求,也会为跨域请求设置Cookie ...