PHP中两个子域之间的共享会话

发布时间:2020-07-07 02:26

我已经看到了许多用于在两个不同子域之间共享会话的解决方案,但是它似乎不适用于我。这是我的设置:

sub1.example.com(用户从此处开始)

sub2.example.com(PHP文件包含在sub1中的文件中)

我使用以下代码在sub2随附的PHP文件中启动会话。会话永远不会直接在sub1上的文件中启动。

ini_set('session.cookie_domain', '.example.com' );
ini_set( 'session.cookie_httponly', 1 );
session_name( 'mySession' );
session_start();

我有一个Java文件存在于sub2上,该文件也调用了sub2中的PHP文件。但是,当我在Javascript文件调用的文件中使用session_start()时,会创建一个不同的会话,通过从sub1调用的PHP文件和Javascript调用的PHP文件中输出会话ID,可以确认这一点。

编辑1:这是文件连接方式以及何时调用session_start的更好描述:

  1. 用户从sub1上的index.php开始。
  2. index.php包括sub2上存在的preload.php。在这里创建会话。
  3. 用户单击登录链接,该链接从sub2调用Javascript文件中的函数。
  4. Javascript从sub2调用login.php。在此处创建的会话与原始会话不匹配。
  5. 一旦用户成功登录,页面就会刷新并再次调用preload.php。这里的会话与步骤2中的会话匹配。

编辑2:这是调用login.php的Javascript(和jQuery):

function loginCheck()
{
    var name = $('#logName').val();
    var pass = $('#pass').val();
    if (pass == '' || name == '')
        return false;

    var button = $('#loginSubmit');
    $.post('SUB2ADDRESS/login.php', {name: name, pass: pass}, function(data){
        button.bind('click', function() {loginCheck(); return false;});
        if (!errorCheck(data))
            location.reload();
});

}

回答1

CBroe让我想到了可能需要传递cookie。我的代码可能不是最好的方法,但是这是我拼凑的:

我将会话cookie的值以及我的POST请求发送到login.php。 我将会话代码更改为以下内容:

ini_set('session.cookie_domain', '.example.com' );
session_name( 'mySession' );
if (isset($_POST['sid']))
    session_id($_POST['sid']);

session_start();

我必须删除HTTPOnly标志,因为我需要通过Javascript访问cookie信息。理想情况下,我想避免这样做,但是我也希望我的代码能够正常工作,并且现在可以执行。