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

时间:2014-03-19 13:45:34

标签: php jquery ajax session cookies

来自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,并且每次都会创建一个新会话。

2 个答案:

答案 0 :(得分:0)

请确保您的AJAX文件已为Cookie设置了相同的域名

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

。这应该有所帮助。如果没有 - 只需向我显示您的AJAX文件。

答案 1 :(得分:0)

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

我不完全确定这会带来安全隐患,但我认为它与在标头中发送cookie并通过$ _COOKIE访问它几乎完全相同。