我正在使用codeigniter建立一个画布facebook页面。用户登录后,api的其余部分与ajax页面一起使用。当我进行第一次ajax调用时,我无法获取会话数据,因此我检查会话是否为空,然后重新加载页面。之后,我在ajax页面中获得会话。因此,只有在一次ajax调用和一次重新加载后,我的session_id才会得到修复。
如果我不进行任何ajax调用但刷新页面,则会话ID每次都会重新生成。
我想要做的就是在开始时将我的数据加载到SESSION一次。并且能够在我的ajax页面上使用它。
更新:我意识到它只发生在IE中,所以我发现了这个问题的线程。但解决方案对我没有用。
facebook canvas session problems in ie
标题('P3P:CP =“IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT”');
htaccess的:
php_value session.save_path "/tmp"
SetEnv session.use_cookies='1';
php_value session.gc_maxlifetime 86400
php_value session.cookielifetime 86400
php_flag log_errors on
php_value error_log "/PHP_errors.log"
CONFIG:
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = FALSE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 7200;
控制器:
function MyController()
{
session_start();
parent::__construct();
$this->connectUser();
}
function connectUser(){
//IF ITS AN AJAX CALL CHECK SESSION AND RELOAD
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
if (!isset($_SESSION["userid"]) ) {
echo "AJAX : ".session_id();// the session id on ajax call
echo "<script type='text/javascript'>
window.top.location = 'https://apps.facebook.com/....';
</script>";
}else echo "I have session data on ajax page";
}
else{
echo "PAGE : ". session_id(); // the session id on page load
if(!isset($_SESSION["userid"])){
$this->load->library('facebook');
$user = $this->facebook->getUser();
if ($user) {
try {
$data['user_profile'] = $this->facebook->api('/me');
} catch (FacebookApiException $e) {
$user = null;
}
}
if (isset($data)) {
//SET SESSION HERE ....
$_SESSION["userid"]=$data['user_profile']["id"];
}
}
}
}
答案 0 :(得分:0)
您使用的是哪个Facebook库?
Codeigniter通过会话类滚动它自己的会话系统。例如$ this-&gt; session-&gt; userdata等,而不是使用本机PHP会话($ _SESSION)。您指定的会话配置仅与Codigniter自己的会话实现有关。
阅读本文:http://codeigniter.com/user_guide/libraries/sessions.html
而不是session_start()在配置中自动加载“session”类,或者放置$ this-&gt; load-&gt; library('session');位于控制器的顶部。
然而,Facebook PHP sdk(https://github.com/facebook/php-sdk)在其实现中使用本机php会话,虽然这是抽象的,可以用您自己的系统覆盖。查看Elliot Haughin的图书馆,了解使用FB和Codeigniter的一个例子:https://github.com/elliothaughin/codeigniter-facebook