【问题标题】:Shared Session Between Two Subdomains in PHPPHP中两个子域之间的共享会话
【发布时间】:2020-07-07 21:59: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();

我有一个存在于 sub2 上的 Javascript 文件,它也调用 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();
});

}

【问题讨论】:

  • “会话永远不会直接在 sub1 上的文件中启动” ????这是什么意思? sub1 中的任何会话如果不启动,如何使用?
  • sub1 中的所有文件都包含 sub2 中的 PHP 文件。 session_start 代码位于 sub2 的包含文件中。
  • 然后向我们展示您的实际 JavaScript 部分。很可能问题出在某个地方。您可能忽略了明确指示它与跨域请求一起传递 cookie。
  • 您可能在这里有所收获。我使用的代码是原始的,只是托管在一个子域上,所以我不需要传递 cookie 信息。我刚刚发布了 Javascript 代码,希望你能告诉我我会在哪里做。
  • 您的第 2 点没有意义。 PHP 包括通过文件系统进行的工作。您绝对不应该通过 HTTP 包含其他 PHP 文件

标签: php jquery session


【解决方案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 信息。理想情况下,我想避免这样做,但我也希望我的代码能够正常工作,而且现在可以。

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 2013-12-16
    • 2021-12-26
    • 2016-12-27
    • 2023-03-09
    • 1970-01-01
    • 2017-07-03
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多