AJAX每次都会创建一个新的会话


AJAX creates a new session every time

http://run.<EXAMPLE>.net/weblogin.php脚本

<?php
switch ($_SERVER['HTTP_ORIGIN']) {
    case 'http://www.<EXAMPLE>.net': case 'http://forums.<EXAMPLE>.net': case 'http://play.<EXAMPLE>.net':
    header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
    break;
}
session_start();
$_SESSION['id'] = 5;
die($_SESSION['id']);
?>

来自http://www.<EXAMPLE>.net/index.php的AJAX调用

$("#loginform").submit(function(e) {
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: "http://run.<EXAMPLE>.net/weblogin.php",
        crossDomain: true,
        data: {user: $("#userinput").val(), pass: $("#passinput").val()},
        dataType: "text",
        success: function(result) {
            console.log(result);
        }
        error: function() {
            alert("AJAX Error");
        }
    });
});

在我的网页上,我使用上面的AJAX将数据发送到weblogin.php脚本,在这个简单的例子中,它只是设置并回显会话变量id。问题是,我可以在服务器上看到,这个脚本每次运行时都会创建一个不熟悉的会话id的新会话,而不是从客户端的cookie访问会话id。

我的所有其他脚本都可以完美地检索和设置会话的会话变量,该会话的id对应于cookie,包括不同子域上的会话,但不是这个AJAX。这是与CORS有关还是与AJAX有关?我必须手动从cookie中获取正确的id并使用它来识别正确的会话吗?

另一个奇怪的事情是,我在控制台中记录了从AJAX返回的文本,但是结果是空白的,即使脚本应该只是回显它刚刚设置为5的变量。

编辑所以weblogin.php脚本甚至不能抓取cookie,就好像AJAX不是来自我的浏览器一样。如果我运行weblogin.php完全独立于页面或AJAX,它工作得很好,只是当做跨子域的AJAX,我不能访问会话或cookie,它创建一个新的会话每次

所以我基本上通过自己生成会话id并在浏览器中为他们设置cookie来解决这个问题,将此cookie分配给内联PHP的javascript变量,然后将cookie与AJAX中的其他数据一起发送,PHP脚本可以使用session_id()来恢复正确的会话。

我不完全确定这对安全的影响,但我认为这与在头中发送cookie并通过$_COOKIE访问它几乎是一样的。

确保您的AJAX文件已经为cookie设置了相同的域,并且

session_start()
在使用会话数据之前,在代码中添加

。这应该会有所帮助。如果没有,请直接向我展示您的AJAX文件。