如何从XMLHttpRequest中检索Cookie?

时间:2017-06-24 09:20:26

标签: 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/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访问它。它不会读取用户名。我错过了什么部分吗?

1 个答案:

答案 0 :(得分:0)

From MDN

  

Credentialed requests

     

Credentialed访问控制请求 - 即请求   附带Cookie或HTTP身份验证信息(以及哪些   期望Cookie与回复一起发送) - 可以是简单的,也可以是   预检,取决于所使用的请求方法。

     

在简单请求方案中,请求将与Cookie一起发送   (例如,如果在XMLHttpRequest上设置了withCredentials标志)。如果   服务器响应Access-Control-Allow-Credentials:true附加   对于凭证响应,然后响应被接受   客户端并暴露给Web内容。在预检请求中,   服务器可以使用Access-Control-Allow-Credentials响应:true   选项请求。

因此您可能需要更改代码 - 但下面未经过测试

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";
    }
}