gpt4 book ai didi

javascript - 不需要响应的跨域 AJAX?

转载 作者:行者123 更新时间:2023-11-30 13:12:31 25 4
gpt4 key购买 nike

我想进行一个不需要响应的跨域 AJAX 调用(它只是为了收集数据)。我知道 JSONP,您可以在其中插入脚本标记,但由于我不会返回任何 JSONP,所以我想也许有更好的方法。是否仍需要使用相同的方法?

最佳答案

如果您控制目标域(收集数据的域)

您可能希望允许“外部”来源,以便您可以使用普通的 XMLHttpRequests 访问它。

在 Apache .htaccess 中类似于(需要 mod_headers):

Header set Access-Control-Allow-Origin *

或者在 PHP 中:

header('Access-Control-Allow-Origin: *');

实际上在 IE8+ 中,跨域 XmlHttpRequests 使用一个特殊的专有接口(interface) (XDomainRequest),jQuery(我最后一次检查)没有规范化。因此,您需要实现自定义 Ajax 传输 以使 jQuery 与 XSS Ajax 一起工作。那将是这样的:

if (window.XDomainRequest) {
$.ajaxTransport(function (options, originalOptions, jqXHR) {
var xdr;
if (window.location.host != options.url.match(/:\/\/(.[^\/]+)/)[1]) {
return {
send: function (headers, completeCallback) {
xdr = new XDomainRequest();
xdr.onload = function () {
var responses = {
text: xdr.responseText
};
completeCallback(200, 'success', responses);
};
xdr.onerror = xdr.ontimeout = function () {
var responses = {
text: xdr.responseText
};
completeCallback(400, 'failed', responses);
};

xdr.open(options.type, options.url);
xdr.send(options.data);
},
abort: function () {
if (xdr) {
xdr.abort();
}
}
};
}
});
}

(我实际在生产中使用它,它应该可以工作)


如果您无法控制目标域

任何请求资源(无论是图像、页面还是脚本)的东西都会执行。

脚本可能仍然是“最轻”的选项,因为它不被渲染(因此不需要任何样式来隐藏它并且在任何情况下都不会导致任何重排)。

var req = document.createElement('script');
req.setAttribute('src', '//example.com/api/count?' + encodeURI('id=1&data=foo bar'));
document.body.appendChild(req);
document.body.removeChild(req);

限制:如果您无法控制调用返回的内容,并且调用返回无效的 javascript,并且您在页面上的其他代码之前执行此代码,则某些浏览器的 javascript 解释器可能会被中断(取决于问题的严重程度)此无效代码导致的错误)。

另请注意,如果您无法控制目标域,并且目标域不值得信任,他们实际上可能会向站点注入(inject)令人讨厌的不良 javascript 并做出令人讨厌的坏事。讨厌。

关于javascript - 不需要响应的跨域 AJAX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13362981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com