跨域AJAX,不需要响应?

时间:2012-11-13 14:55:52

标签: javascript ajax

我想进行跨域AJAX调用,该调用不需要响应(它只是用于收集数据)。我知道你插入脚本标签的JSONP,但因为我不会返回任何JSONP,我想也许有更好的方法。我还是需要使用相同的方法吗?

4 个答案:

答案 0 :(得分:3)

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

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

在Apache .htaccess中就像(需要mod_headers):

Header set Access-Control-Allow-Origin *

或者在PHP中:

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

实际上在IE8 +中,跨域XmlHttpRequests使用了一个特殊的专有接口(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解释器可能会被中断(取决于这个无效代码导致的错误。)

另请注意,如果您无法控制目标域,并且目标域不值得信任,那么他们实际上可能会在网站中注入令人讨厌的错误javascript,并做出令人讨厌的坏事。讨厌。

答案 1 :(得分:0)

您可以动态创建表单,并使用表单的目标属性将其值发布到隐藏的iframe。

答案 2 :(得分:0)

你可以使用一个隐藏的iframe,你可以创建一个隐藏的形式来定位它:

// data is a key-value pair'd object as such:{"key":"value, "key":"value" }
window.xss = function (url, method, data) {
    // function to make creating hidden form elements easier:
    function hEle = function (key,value) {
        var ele = document.createElement("input");
        ele.type = "hidden";
        ele.name = key;
        ele.value = value;
        return ele;
    }

    // create the iframe(can't remember if this has to be appended to the DOM):
    var myIframe = document.createElement("iframe");

    // create the form:
    var myForm = document.createElement("form");
    myForm.setAttribute("action", url);
    myForm.setAttribute("method", method||"GET");
    myForm.target = myIframe;

    // loop through `data` adding hidden elements to the form:
    for (var key in data) {
        if(data.hasOwnProperty(key)) {
            myForm.appendChild(hEle(key, data[key]));
        }
    }

    // Once everything is setup, submit the form
    myForm.submit();
}

// to use:
xss("http://siteIDonthost.com/", "POST", {"myKey" : "OHNOES, VALUE!" });



几点说明:
我不记得是否必须将iframe附加到文档中 我不记得你是否可以像我一样定位iframe(没有id或者这样)

答案 3 :(得分:0)

我唯一知道的选择是让服务器为您执行查询,如果这是一个选项。换句话说,在将要执行请求的Web服务器上提供某种服务...特别是因为您不需要解析任何返回数据,这将是相当简单的。例如,您可以在PHP中使用简单的file()调用:

http://us3.php.net/manual/en/function.file.php