Php 如何从XMLHttpRequest检索Cookie?

Php 如何从XMLHttpRequest检索Cookie?,php,xmlhttprequest,Php,Xmlhttprequest,我有一个javascript代码从php文件中获取用户名。javascript代码不在同一个域中,因此它是跨域的。在这种情况下,domain1.com希望使用XMLHttpRequest从domain2.com检索用户信息。这是密码 var http = new XMLHttpRequest(); http.open("POST", linkbased+'/username/', true); http.setRequestHeader("Content-type", "application/

我有一个javascript代码从php文件中获取用户名。javascript代码不在同一个域中,因此它是跨域的。在这种情况下,domain1.com希望使用XMLHttpRequest从domain2.com检索用户信息。这是密码

var http = new XMLHttpRequest();
http.open("POST", linkbased+'/username/', true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange = function() {
    if(http.readyState == 4 && http.status == 200) {
        document.getElementById("username").innerHTML = http.responseText;
    }
}
http.send(data);
这是我的php文件代码

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
echo $_COOKIE['username'];
?>

如果我直接访问php代码,它将显示用户名。但是,如果我通过XMLHttpRequest访问它。它不会读取用户名。我缺少什么吗?

认证请求 经认证的访问控制请求–即 附带cookie或HTTP身份验证信息(以及 希望发送带有响应的cookie)-可以是简单的,也可以是 预飞行,取决于所使用的请求方法

在一个简单的请求场景中,请求将与cookie一起发送 (例如,如果在XMLHttpRequest上设置了withCredentials标志)。如果 服务器响应访问控制允许凭据:true已附加 对于已认证的响应,则响应被 客户端,并暴露于web内容。在预飞行请求中 服务器可以使用访问控制允许凭据进行响应:对 选项请求

因此,您可能需要修改您的代码-但是下面的代码没有经过测试

var http = new XMLHttpRequest();
http.withCredentials = true;
http.onreadystatechange = function() {
    if(http.readyState == 4 && http.status == 200) {
        document.getElementById("username").innerHTML = http.responseText;
    }
}

http.open("POST", linkbased+'/username/', true);
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
http.send( data );




if( $_SERVER['REQUEST_METHOD'] == "POST" ) {

    if( $_SERVER['HTTP_ORIGIN'] == 'http://domain1.com' ){
        header('Access-Control-Allow-Origin: http://domain1.com');
        header('Access-Control-Allow-Methods: GET, POST');
        header('Access-Control-Allow-Credentials: true');
        header('Content-Type: text/plain');

        echo array_key_exists( 'username', $_COOKIE ) ? $_COOKIE['username'] : 'username not set';

    } else {
        header('HTTP/1.1 403 Access Forbidden',true,403);
        header('Content-Type: text/plain');
        echo "Sorry, you are not allowed to make such a request";
    }
}

认证请求 经认证的访问控制请求–即 附带cookie或HTTP身份验证信息(以及 希望发送带有响应的cookie)-可以是简单的,也可以是 预飞行,取决于所使用的请求方法

在一个简单的请求场景中,请求将与cookie一起发送 (例如,如果在XMLHttpRequest上设置了withCredentials标志)。如果 服务器响应访问控制允许凭据:true已附加 对于已认证的响应,则响应被 客户端,并暴露于web内容。在预飞行请求中 服务器可以使用访问控制允许凭据进行响应:对 选项请求

因此,您可能需要修改您的代码-但是下面的代码没有经过测试

var http = new XMLHttpRequest();
http.withCredentials = true;
http.onreadystatechange = function() {
    if(http.readyState == 4 && http.status == 200) {
        document.getElementById("username").innerHTML = http.responseText;
    }
}

http.open("POST", linkbased+'/username/', true);
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
http.send( data );




if( $_SERVER['REQUEST_METHOD'] == "POST" ) {

    if( $_SERVER['HTTP_ORIGIN'] == 'http://domain1.com' ){
        header('Access-Control-Allow-Origin: http://domain1.com');
        header('Access-Control-Allow-Methods: GET, POST');
        header('Access-Control-Allow-Credentials: true');
        header('Content-Type: text/plain');

        echo array_key_exists( 'username', $_COOKIE ) ? $_COOKIE['username'] : 'username not set';

    } else {
        header('HTTP/1.1 403 Access Forbidden',true,403);
        header('Content-Type: text/plain');
        echo "Sorry, you are not allowed to make such a request";
    }
}

假设来源相同,XHR发送cookie的方式与浏览器加载方式相同。我建议使用
http.addEventListener('load',x=>…)
而不是onreadystatechange,并添加一个日志以查看
http
在该句柄中的外观服务器发送的
访问控制
头是什么?@PaulS。请提供使用addEventListener的示例代码。我以前从未使用过它。在XHR发送cookie时看到的答案与浏览器加载相同,假设来源相同。我建议使用
http.addEventListener('load',x=>…)
而不是onreadystatechange,并添加一个日志以查看
http
在该句柄中的外观服务器发送的
访问控制
头是什么?@PaulS。请提供使用addEventListener的示例代码。我以前从未使用过它。它仍然无法读取cookie,只显示“用户名未设置”。当我直接访问它时,它会显示用户名。cookie设置在哪里?domain1.com?我用自己的域名更改了domain1.com,因为cookie保存在那里。而且。。。这是否达到了预期效果?是的,我只想从XMLHttpRequest中获取cookie,并将用户名作为小部件显示在不同的域中。如果cookie在同一个域中,但如果它是跨域的,则cookie可以正常工作。它不会工作。它仍然无法读取cookie,只显示“用户名未设置”。当我直接访问它时,它会显示用户名。cookie设置在哪里?domain1.com?我用自己的域名更改了domain1.com,因为cookie保存在那里。而且。。。这是否达到了预期效果?是的,我只想从XMLHttpRequest中获取cookie,并将用户名作为小部件显示在不同的域中。如果cookie在同一个域中,但如果它是跨域的,则cookie可以正常工作。这行不通。