Facebook应用程序适用于所有浏览器,但不适用于IE8

时间:2010-12-17 03:07:55

标签: facebook session cross-browser

我正在开发一个Facebook应用程序。 Stragnly,该应用程序在大多数浏览器上都能正常工作(我在FF,chrome和safari上进行了测试,并且它在所有浏览器上都运行良好)。但是,当我在IE8上测试时,我在尝试对其中一个页面进行ajax调用时收到此错误消息:

Fatal error: Uncaught Exception: 102: Requires user session thrown in
/home1/website/public_html/facebook/src/facebook.php on line 515

这是包含facebook.php中的第515行的函数:

protected function _restserver($params) {
  // generic application level parameters
  $params['api_key'] = $this->getAppId();
  $params['format'] = 'json-strings';

  $result = json_decode($this->_oauthRequest(
    $this->getApiUrl($params['method']),
    $params
  ), true);

  // results are returned, errors are thrown
  if (is_array($result) && isset($result['error_code'])) {
    throw new FacebookApiException($result);
  }
  return $result;
}

我的猜测是,无论是使用会话还是IE8设置都可以,但我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:22)

尝试在php文件的顶部添加此标题:

<?php
    header('p3p: CP="NOI ADM DEV PSAi COM NAV OUR OTR STP IND DEM"');
?> 

这将使跨域AJAX调用在IE中运行

修改

实际上,长期正确答案如下:

在开发IFrame Canvas应用程序(或来自不同域的页面中托管的任何其他iframe)时,在某些情况下(默认IE配置)会限制对cookie(称为第三方Cookie)的访问。 Firefox,Chrome,Safari,Opera都按预期工作,但IE阻止访问此Cookie。此标头(称为P3P Compact Privacy Policy)的存在将使IE接受来自不同域的cookie。

这是如何使你的会话代码工作的?

即使在服务器中保存会话信息,该页面也会发布存储在客户端中的会话cookie。如果你的iframe使用了session,那么浏览器必须允许它存储cookie。

落入存储cookie意味着会话将丢失,基于会话的代码将像您发布的那样失败。

希望这有帮助。

PS:BTW我不知道p3p头中所有奇怪的首字母缩略词是什么意思。我已经看到它的许多变化,所以你应该尝试更多地研究它

答案 1 :(得分:0)

如果您在Microsoft .net平台上运行,则可以在IIS中设置P3P标头。

请参阅以下链接,但您可以跳过关于必须拥有策略XML文件并直接添加标题的废话!

http://support.microsoft.com/kb/324013