我有一个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访问它。它不会读取用户名。我错过了什么部分吗?
答案 0 :(得分:0)
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";
}
}