跨域共享会话

Shared Session Across Domains

好的..我有两个域 example.com 和 example.net,它们共享相同的代码 space 和会话。问题是当用户更改语言时域应该更改,当发生这种情况时所有会话数据都将丢失。我想在此之前进行 ajax 调用,以便我可以更改会话。 这是用于初始化会话的代码。

<?php 
    /* This method is invoked */
    public function start($session_id = '', $key = 'default') {
        if (!session_id()) {
            ini_set('session.use_only_cookies', 'Off');
            ini_set('session.use_cookies', 'On');
            ini_set('session.use_trans_sid', 'Off');
            ini_set('session.cookie_httponly', 'On');

            if ($session_id) {
                session_id($session_id);
            }   

            if (isset($_COOKIE[session_name()]) && !preg_match('/^[a-zA-Z0-9,\-]{22,52}$/', $_COOKIE[session_name()])) {
                exit('Error: Invalid session ID!');
            }

            session_set_cookie_params(0, '/');
            session_start();
        }

        if (!isset($_SESSION[$key])) {
            $_SESSION[$key] = array();
        }

        $this->data =& $_SESSION[$key]; 

        return true;            
    }

我尝试创建一个独立的脚本来处理 ajax 调用,但没有成功。

<?php 
    ini_set('session.use_only_cookies', 'Off');
    ini_set('session.use_cookies', 'On');
    ini_set('session.use_trans_sid', 'Off');
    ini_set('session.cookie_httponly', 'On');


    session_set_cookie_params(0, '/');
    session_start();
    session_id($_POST['session_id']);


    header('Content-Type: application/json');
    $data = array('session_id' => session_id());
    echo json_encode($data);

在两个域之间切换时不会保留会话。 有什么线索吗?

这是 Web 浏览器的一项安全功能 - 会话使用附加到域的 cookie,浏览器不会将此 cookie 发送到另一个域。

当您控制这两个域时,您可以通过在 URL 中包含身份验证信息来实现此目的。这是一个复杂的话题。您可以自制一些可行的东西,但如果您不熟悉安全问题,最好使用现成的单点登录解决方案。