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

khr*_*003 7 session facebook 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
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Car*_*ñoz 22

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

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

这将使跨域AJAX调用在IE中工作

编辑:

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

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

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

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

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

希望这可以帮助.

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

  • 哇.这当然是一条神奇的路线.它工作得很好(我必须关闭并打开IE8来刷新Ajax消息).这条线做什么? (2认同)
  • 非常感谢您的解释.我做了一些研究,这里是解释奇怪的首字母缩略词的链接:http://www.p3pwriter.com/LRN_111.asp (2认同)