我正在开发一个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设置都可以,但我不知道如何解决这个问题。
答案 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文件并直接添加标题的废话!