【问题标题】:Unable to create session in php on AJAX call无法在 AJAX 调用的 php 中创建会话
【发布时间】:2014-04-24 17:28:00
【问题描述】:

我在根域上有一个 example.com/login.php 文件,其中包含此代码

header('Access-Control-Allow-Origin: *');
session_set_cookie_params(0, '/', '.example.com');
session_name('lusession');
session_start();
$_SESSION['name'] = $_GET['name'];
$_SESSION['useremail'] = $_GET['useremail'];
$_SESSION['password'] =  $_GET['password'];

此文件提供了凭据,然后它会创建登录会话。由AJAX从主域和子域调用。

问题是它在通过 AJAX 调用时不会创建会话,但是当直接在浏览器中作为查询字符串打开时,它会按预期创建跨域会话。

其他通过 AJAX 调用它的页面在开始时有以下代码:

session_set_cookie_params(0, '/', '.example.com');
session_name('lusession');
session_start();

如果我在 login.php 中添加以下代码,它会在 AJAX 响应中显示该会话已创建。但该会话在同一域和其他子域的页面上不可用。

echo 'session created for'.$_SESSION['name'];

检查资源显示 AJAX 调用创建了名称为“lusession”的会话 cookie。

【问题讨论】:

  • session.cookie_httponly(或者:session_set_cookie_params() 的第 5 个参数,如果你愿意的话)。
  • 我正在探索它;如果你把它写成一个答案,就好像它有帮助一样,我会把它标记为已接受。
  • 我会将其添加为真正的答案。如果有帮助,您能否将您的问题更改为“无法使用 javascript 创建 PHP 会话”?下一个遇到问题的人更容易发现。

标签: php ajax session session-cookies


【解决方案1】:

脚本语言对会话 cookie 的访问由 session.cookie_httponly 配置设置控制。或者,如果您愿意,可以使用session_set_cookie_params() 的第 5 个参数。

【讨论】:

  • 在这一点上不走运,如果直接在浏览器中调用,该文件可以正常工作。那为什么不在 AJAX 调用上创建会话
  • 如果你观察你的调试器,它会在 ajax 调用中返回 cookie 吗?
  • 是的,它会创建会话 cookie 'lusession'
  • 你在哪些域工作,什么是正常域,另一个域是什么?
  • 嗯。您能证明您在该 Ajax 请求中收到的确切 Set-Cookie 标头吗?
【解决方案2】:

很好理解。

实际上,AJAX 调用仅在您调用的 url 与调用脚本位于同一域时才会发送 Cookie。子域被视为单独的域。虽然这段代码创建了跨子域会话,但涉及 AJAX 是罪魁祸首。

在这种情况下,当我的调用脚本位于 sub.domain.com 上时,我试图从 domain.com 调用 url(换句话说:我进行了跨域调用,在这种情况下浏览器没有发送任何cookie 以保护隐私)。

对我有用的解决方案是我将 login.php 文件放在每个子域上,以便来自该子域的调用。以这种方式创建会话,一旦在一个子域上创建会话,它就可以在所有子域上根据需要使用。

【讨论】:

  • 啊,很高兴知道您找到了解决方案
猜你喜欢
  • 1970-01-01
  • 2013-01-12
  • 2013-12-05
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多