CORS 预检请求使用 jQuery AJAX,但在 Firefox 中使用本机 XmlHttpRequests 失败
CORS preflight requests working with jQuery AJAX, but failing with native XmlHttpRequests in Firefox
This question is based on an issue I had before but never managed to resolve.
我是 运行 通过 FireMonkey 的用户脚本,它定期向我的后端服务器发送请求,那些使用 CORS 的服务器是 cross-domain。出于测试目的,我的回复 headers 目前设置得非常宽松 backend-side:
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Method: POST");
header("Access-Control-Allow-Headers: *");
Frontend-side 我的请求是通过 jQuery AJAX
发送的,大致如下所示:
$.ajax({
method: "POST",
url: this.queryURL,
timeout: this.timeout,
data: this.formData,
processData: false,
contentType: false,
success: onSuccess,
error: onError
});
这里没什么特别的,从那以后请求一直运行良好。
我现在想摆脱 jQuery
并改用原生 XmlHttpRequest
。实现如下所示:
const xhr = new XMLHttpRequest();
xhr.open("POST", this.queryURL);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.timeout = this.timeout;
xhr.ontimeout = onTimeout;
xhr.onreadystatechange = () => {
if (xhr.readyState !== 4 || xhr.status === 0)
return;
if (xhr.status !== 200)
onError(xhr);
else
onSuccess(xhr.responseText);
};
xhr.send(this.formData);
出于某种原因,在 Firefox 上似乎不再发送请求,至少网络选项卡没有显示任何请求。在 Chrome 上测试它仍然有效,但我认为这个问题可能与预检请求有关,因为我注意到一些奇怪的事情:
与jQuery AJAX:
使用原生 XHR:
使用本机 XHR,Chrome 似乎总是有第一个预检请求失败,第二个请求成功。 AJAX
不会发生这种情况。不确定这是否有任何帮助,但这是否可以解释为什么请求在 Firefox 中总是失败,以及如何解决它?
经过更多研究,我终于发现这实际上是用户脚本的 firefox-related 问题:https://bugzilla.mozilla.org/show_bug.cgi?id=1715249
This question is based on an issue I had before but never managed to resolve.
我是 运行 通过 FireMonkey 的用户脚本,它定期向我的后端服务器发送请求,那些使用 CORS 的服务器是 cross-domain。出于测试目的,我的回复 headers 目前设置得非常宽松 backend-side:
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Method: POST");
header("Access-Control-Allow-Headers: *");
Frontend-side 我的请求是通过 jQuery AJAX
发送的,大致如下所示:
$.ajax({
method: "POST",
url: this.queryURL,
timeout: this.timeout,
data: this.formData,
processData: false,
contentType: false,
success: onSuccess,
error: onError
});
这里没什么特别的,从那以后请求一直运行良好。
我现在想摆脱 jQuery
并改用原生 XmlHttpRequest
。实现如下所示:
const xhr = new XMLHttpRequest();
xhr.open("POST", this.queryURL);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.timeout = this.timeout;
xhr.ontimeout = onTimeout;
xhr.onreadystatechange = () => {
if (xhr.readyState !== 4 || xhr.status === 0)
return;
if (xhr.status !== 200)
onError(xhr);
else
onSuccess(xhr.responseText);
};
xhr.send(this.formData);
出于某种原因,在 Firefox 上似乎不再发送请求,至少网络选项卡没有显示任何请求。在 Chrome 上测试它仍然有效,但我认为这个问题可能与预检请求有关,因为我注意到一些奇怪的事情:
与jQuery AJAX:
使用原生 XHR:
使用本机 XHR,Chrome 似乎总是有第一个预检请求失败,第二个请求成功。 AJAX
不会发生这种情况。不确定这是否有任何帮助,但这是否可以解释为什么请求在 Firefox 中总是失败,以及如何解决它?
经过更多研究,我终于发现这实际上是用户脚本的 firefox-related 问题:https://bugzilla.mozilla.org/show_bug.cgi?id=1715249