【问题标题】:session id regenerates in every reload每次重新加载时都会重新生成会话 ID
【发布时间】:2012-06-18 13:21:39
【问题描述】:

我正在使用 codeigniter 构建一个画布 Facebook 页面。用户登录后,其余的 api 使用 ajax 页面。当我进行第一次 ajax 调用时,我无法获取会话数据,因此我检查会话是否为空,然后重新加载页面。之后,我在 ajax 页面中获得会话。所以只有在一次 ajax 调用和一次重新加载之后,我的 session_id 才会得到修复。

如果我不执行任何 ajax 调用而是刷新页面,会话 ID 每次都会重新生成。

我要做的就是在开始时将我的数据加载到 SESSION 一次。并且能够在我的 ajax 页面上使用它。

更新:我已经意识到它只发生在 IE 中,所以我找到了关于这个问题的线程。但是解决方案对我不起作用。

facebook canvas session problems in ie

header('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['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"];

                    }

                }


        }

}

【问题讨论】:

    标签: php facebook session iframe codeigniter-2


    【解决方案1】:

    您使用的是哪个 Facebook 库?

    Codeigniter 通过会话类滚动它自己的会话系统。例如 $this->session->userdata 等,而不是使用原生 PHP 会话 ($_SESSION)。您指定的会话配置仅与 Codigniter 自己的会话实现有关。

    阅读:http://codeigniter.com/user_guide/libraries/sessions.html

    而不是 session_start() 在你的配置中自动加载“会话”类,或者放置 $this->load->library('session');在控制器的顶部。

    Facebook PHP sdk (https://github.com/facebook/php-sdk) 在它的实现中使用了本地 php 会话,尽管这是抽象的并且可以用您自己的系统覆盖。

    查看 Elliot Haughin 的库以获取使用 FB 和 Codeigniter 的示例:https://github.com/elliothaughin/codeigniter-facebook

    【讨论】:

    • 当我第一次遇到这个问题时,我确实首先使用了 codigniter 的会话类,我认为 codeigniter 会话是问题,所以我使用了本机会话,但没有任何改变。我使用最新的 Facebook PHP SDK (v.3.1.1) 。我还在自动加载中加载库: $autoload['libraries'] = array('database','Template','memcached_library','facebook','session');
    • 我试过你建议的库。它卡在重新加载循环中,因为即使我登录它也无法访问我的用户信息。
    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 2018-07-04
    • 2017-04-06
    • 2011-12-29
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多