有人能帮助我了解跨域异步JS请求的东西,以及如何调试它



我试图通过jQuery的ajax进行跨域异步GET请求,我很难理解正在发生的事情和web浏览器错误消息。

首先,这里是CoffeeScript代码:
$(document).on('submit', '.myform', (e) ->
    try
        foo = 'val'                
        settings =
            data: { foo: foo }
            type: 'GET'
            dataType: 'json'
            success: (data, textStatus, jqXHR) ->
                console.log data if debug?
                console.log textStatus if debug?
            error: (jqXHR, textStatus, errorThrown) ->
                console.warn textStatus if debug?
                console.warn errorThrown if debug?
        $.ajax('http://anotherserver.tld/api', settings)
    catch error
        console.error error
    finally
        return false
)

我理解json是一个有效的数据类型,只有当你设置了一个跨域文件的主机服务JavaScript。下面是我使用的(让我们称服务器为my_server.tld):

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <!-- Read this: https://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
    <!-- Most restrictive policy: -->
    <!-- <site-control permitted-cross-domain-policies="none"/> -->
    <!-- Least restrictive policy: -->
    <site-control permitted-cross-domain-policies="all"/>
    <allow-access-from domain="*" to-ports="*" secure="false"/>
    <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>

(这是来自HTML5样板)

当我尝试这段代码时,我得到以下错误:
[Error] XMLHttpRequest cannot load http://anotherserver.tld/api?foo=val. Origin http://my_server.tld is not allowed by Access-Control-Allow-Origin.

这让我很困惑。是my_serveranotherserver上缺少的东西还是错误的配置?crossdomain.xml文件是否与此类问题相关?

原因,即使我没有访问anotherserver.tld,我用my_other_server尝试了这个代码,我可以完全看到my_other_server访问日志中的请求。

谢谢你的帮助。

(为了记录,我也尝试切换到jsonp,但后来我得到一个解析错误的东西,看起来像完美的JSON数据…有些头发掉了)

更新:这是anotherserver.tldcrossdomain.xml文件:

<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

您的jquery代码是好的。您需要检查ajax-server的所有者是否允许跨域请求。

不可能使ajax请求跨域服务器,除非它们已配置为这样做。

在这里阅读更多信息:https://en.wikipedia.org/wiki/Cross-origin_resource_sharing


具体来说,anotherserver.tld应该在其响应中包含Access-Control-Allow-Origin: my_server(或*)头。

相关内容

  • 没有找到相关文章

最新更新