当需要身份验证时,使用 JSON 的跨源 AJAX 请求中断
Cross origin AJAX request with JSON breaks when authentication is required
我正在尝试对另一个站点上的 PHP 文件进行 AJAX 调用:
$.ajax({
type: "GET",
dataType: "json",
url: 'http://user:password@www.myurl.com/myphpfile.php',
data: {
records: JSON.stringify(workingarray),
account: account,
},
complete: function(response) {
var parsedresponse = $.parseJSON(JSON.stringify(response)).responseText.split("<br>");
otherFunction(parsedresponse);
}
});
我的 PHP 文件:
<?php
header('Access-Control-Allow-Origin: *');
header('content-type: application/json; charset=utf-8');
$records = json_decode($_GET['records']);
$account = $_GET['account'];
.....[LOGIN AND SQL QUERY].....
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
$conn->close();
?>
这一切都很好,直到我注意到我实际上并没有打开身份验证。一旦我这样做了,整个事情就崩溃了,我总是得到以下错误:
XMLHttpRequest cannot load
http://user:password@www.myurl.com/myphpfile.php (...) . No
'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'http://originurl.co.uk' is therefore not allowed
access. The response had HTTP status code 401.
正如您将从我的 PHP 代码中看到的那样,存在一个 header。我还尝试将以下两行添加到我的 .htaccess:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Credentials true
效果微乎其微,也就是说,没有任何效果。
我已尝试将数据类型转换为 JSONP,但我不太确定该怎么做...我尝试了以下更改:
$.ajax({
type: "GET",
dataType: "jsonp",
url: 'http://user:password@www.myurl.com/myphpfile.php?callback=?',
data: {
records: JSON.stringify(workingarray),
account: account,
},
complete: function(response) {
var parsedresponse = $.parseJSON(JSON.stringify(response)).responseText.split("<br>");
otherFunction(parsedresponse);
}
});
我的 PHP 文件:
<?php
header('Access-Control-Allow-Origin: *');
header('content-type: application/jsonp; charset=utf-8');
...
while ($row = $result->fetch_assoc()) {
echo $_GET['callback'] . "(" . json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ")";
}
$conn->close();
?>
据我所知,这不会导致控制台出现错误,但我在响应中唯一能理解的是:
status: 200
statusText: "load"
(出于调试目的,我在 complete:
函数中添加了 console.log(parsedresponse)
行,但我必须承认,我并不完全确定如何解释我所看到的大部分内容。)
任何帮助或建议将不胜感激,因为这让我很沮丧。
我相信我已经解决了这个问题——我还没有完全重写应用程序,但我能够拨打电话并得到回应,所以从现在开始一切应该都是一帆风顺的(著名的遗言,哈哈).
无论如何,我所做的更改如下 - 我首先在 AJAX 调用中将 complete
切换为 success
:
$.ajax({
type: "GET",
dataType: "jsonp",
url: 'https://user:password@www.myurl.com/myphpfile.php?callback=?',
data: {
records: JSON.stringify(workingarray),
account: account,
},
success: function(response) {
console.log(response);
otherFunction(response);
}
});
然后,我认为这可能是主要问题,我不得不重写 PHP 文件的这一部分...
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
...成为:
$result = $conn->query($sql);
$rows = array();
while ($row = $result->fetch_assoc()) {
$rows[] = array('data' => $row['Some columns']);
}
echo $_GET['callback'] . "(" . json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ")";
...显然(回想起来)我以前的方法返回了多个同名函数。
我还将请求 URL 更改为 https,我认为对于预期用途来说应该足够安全。
无论如何希望有人觉得我的经验有用。
我正在尝试对另一个站点上的 PHP 文件进行 AJAX 调用:
$.ajax({
type: "GET",
dataType: "json",
url: 'http://user:password@www.myurl.com/myphpfile.php',
data: {
records: JSON.stringify(workingarray),
account: account,
},
complete: function(response) {
var parsedresponse = $.parseJSON(JSON.stringify(response)).responseText.split("<br>");
otherFunction(parsedresponse);
}
});
我的 PHP 文件:
<?php
header('Access-Control-Allow-Origin: *');
header('content-type: application/json; charset=utf-8');
$records = json_decode($_GET['records']);
$account = $_GET['account'];
.....[LOGIN AND SQL QUERY].....
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
$conn->close();
?>
这一切都很好,直到我注意到我实际上并没有打开身份验证。一旦我这样做了,整个事情就崩溃了,我总是得到以下错误:
XMLHttpRequest cannot load http://user:password@www.myurl.com/myphpfile.php (...) . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://originurl.co.uk' is therefore not allowed access. The response had HTTP status code 401.
正如您将从我的 PHP 代码中看到的那样,存在一个 header。我还尝试将以下两行添加到我的 .htaccess:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Credentials true
效果微乎其微,也就是说,没有任何效果。
我已尝试将数据类型转换为 JSONP,但我不太确定该怎么做...我尝试了以下更改:
$.ajax({
type: "GET",
dataType: "jsonp",
url: 'http://user:password@www.myurl.com/myphpfile.php?callback=?',
data: {
records: JSON.stringify(workingarray),
account: account,
},
complete: function(response) {
var parsedresponse = $.parseJSON(JSON.stringify(response)).responseText.split("<br>");
otherFunction(parsedresponse);
}
});
我的 PHP 文件:
<?php
header('Access-Control-Allow-Origin: *');
header('content-type: application/jsonp; charset=utf-8');
...
while ($row = $result->fetch_assoc()) {
echo $_GET['callback'] . "(" . json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ")";
}
$conn->close();
?>
据我所知,这不会导致控制台出现错误,但我在响应中唯一能理解的是:
status: 200
statusText: "load"
(出于调试目的,我在 complete:
函数中添加了 console.log(parsedresponse)
行,但我必须承认,我并不完全确定如何解释我所看到的大部分内容。)
任何帮助或建议将不胜感激,因为这让我很沮丧。
我相信我已经解决了这个问题——我还没有完全重写应用程序,但我能够拨打电话并得到回应,所以从现在开始一切应该都是一帆风顺的(著名的遗言,哈哈).
无论如何,我所做的更改如下 - 我首先在 AJAX 调用中将 complete
切换为 success
:
$.ajax({
type: "GET",
dataType: "jsonp",
url: 'https://user:password@www.myurl.com/myphpfile.php?callback=?',
data: {
records: JSON.stringify(workingarray),
account: account,
},
success: function(response) {
console.log(response);
otherFunction(response);
}
});
然后,我认为这可能是主要问题,我不得不重写 PHP 文件的这一部分...
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
...成为:
$result = $conn->query($sql);
$rows = array();
while ($row = $result->fetch_assoc()) {
$rows[] = array('data' => $row['Some columns']);
}
echo $_GET['callback'] . "(" . json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ")";
...显然(回想起来)我以前的方法返回了多个同名函数。
我还将请求 URL 更改为 https,我认为对于预期用途来说应该足够安全。
无论如何希望有人觉得我的经验有用。