【问题标题】:Maintain PHP session in Facebook AJAX request在 Facebook AJAX 请求中维护 PHP 会话
【发布时间】:2011-07-21 13:35:47
【问题描述】:

我有一个 Facebook iframe 应用。确认应用授权后,我会从签名请求中获取一些数据并将其放入会话中:

<?php
    session_start();
    $signed_request = $_REQUEST["signed_request"];
    list($encoded_sig, $payload) = explode('.', $signed_request, 2); 
    $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
    if(empty($data["user_id"])) {
        echo("<script> top.location.href='$auth_url'</script>");
        exit;
    }
    $_SESSION['fb_id'] = $data['user_id'];
?>

很简单,对吧?所以现在用户可以与我的应用程序交互,最终用户操作会触发 AJAX 请求。我为此使用 jQuery:

$.ajax({
    type:'POST',
    url:'include/handler.php',
    data:'name=value',
    success: function(msg) {
        alert("Success: "+msg);
    },
    error: function(msg) {
        alert("Fail: "+msg);    
    }
});

那么在handler.php中,我需要使用之前保存的会话值,但是会话是空的。

<?php
    session_start();
    echo $_SESSION['fb_id'];
?>

显然这些代码 sn-ps 被简化了,但是任何人都可以向我解释一下吗?我有一种感觉,我在做一些愚蠢的事情,但这是漫长的一天。

【问题讨论】:

  • ajax 调用是否使用同一个会话?每次获取一个新会话都会显示为 fb_id 变量没有“粘”,因为它是在其他会话中设置的。
  • 我不得不假设他们不是昨晚,最终完全放弃了会议。我已经通过完全不使用 session 解决了这个问题,但我仍然很感激能解释为什么会发生这种情况。

标签: php jquery ajax facebook session


【解决方案1】:

$.ajax({ ..., 缓存:假, ... }); 如果您使用的是 IE,这可能是 IE 缓存 ajax 请求的问题。或者,如果 facebook graph api 请求与 ajax 请求同时运行,则可能存在一些时间问题。

【讨论】:

  • 抱歉,问题发生在所有浏览器中,并且当不应该有任何 API 请求处于活动状态时,请求是在用户交互时发出的。
【解决方案2】:

为什么不将 Facebook ID 传递给 handler.php?

...
url:'include/handler.php?fb_id=<?php $_SESSION['fb_id']?>',

在 handler.php 中,检查会话和传递的变量。

【讨论】:

  • 目标是不通过 Ajax 请求传递除用户提供的表单数据之外的任何内容。这已经通过采用不同的方法得到纠正,但我仍然欢迎解释为什么在我的原始示例中 $_SESSION 会为空。
【解决方案3】:

事实证明,这归结于我使用的共享托管环境的问题。无论出于何种原因,来自 AJAX 或 Flash 的请求都使用唯一的会话 ID 进行处理。解决方法只是转移到不同的托管服务提供商。

【讨论】:

  • 进一步澄清:我不知道奇怪的会话行为是否是由于旧提供程序的设置,但使用不同的主机并在本地测试会话数据按预期工作。
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 2013-11-25
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多