jQuery Ajax跨站点脚本

jQuery Ajax跨站点脚本,jquery,ajax,cross-domain,Jquery,Ajax,Cross Domain,我知道这个问题以前已经被问过很多次了,但我似乎仍然不能正确回答 我想在jQuery中执行一个AJAX请求并获取“任意”内容——例如,它可能是html、文本、json、img 当我执行下面这样的操作时,我会得到臭名昭著的 请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许对源“”进行访问。 $.ajax({ url: "http://www.pureexample.com/jquery/cross-domain-ajax.html

我知道这个问题以前已经被问过很多次了,但我似乎仍然不能正确回答

我想在jQuery中执行一个AJAX请求并获取“任意”内容——例如,它可能是html、文本、json、img

当我执行下面这样的操作时,我会得到臭名昭著的 请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许对源“”进行访问。

$.ajax({
            url: "http://www.pureexample.com/jquery/cross-domain-ajax.html",
            // dataType: "jsonp",
            crossDomain: true,   
            success: function (data) {
                        console.log('success');
                         console.log(data);

           },
            error: function(request, status, error) {
                    console.log('Error on request. ' + request.responseText);
                    alert('Error on request. ' + request.responseText);
                }
        });
我没有提供数据,因此我无法在服务器端执行任何操作以允许跨域请求。我认为指定JSONP(注释掉)假设返回JSON?不管有没有,它都不起作用

那么,底线——是否有一种“简单”的方法来处理跨域请求,以便我可以得到结果并插入到标记中(例如,将html插入到DIV中)

非常感谢您的帮助或进一步解释

谢谢。
Rob

不久前,我在使用外部Web服务检索巴西人的邮政编码数据(地址等)时遇到了这个问题。 我使用了与你完全相同的方法

有几点需要强调:

1) Ajax不允许安全协议差异。这意味着,如果您的页面使用安全协议(HTTPS)进行保护,您的浏览器将不允许外部服务器通过不安全协议(HTTP)返回。(我在开发的后期发现了这一点,结果是使用了.NET的webrequest)

2) 将数据类型设置为“JSONP”不会将响应转换为JSON。它允许它被如此接收

3) JSONP是唯一接受跨域请求的数据类型。您描述的错误消息可能是由于这个原因

因此,总结一下:

在使用ajax讨论跨域请求时,“任意”内容仅限于JSON(p)。接收的数据必须是JSON

此外,在jQuery1.5之前,如果响应没有正确地键入为JSON,则不会引发错误

我希望在我开始发展之前就知道这些问题。。。在不知道从SSL分层服务器请求HTTP中存储的数据这一事实的情况下,将组件上载到生产服务器是一件非常尴尬的事情。。。(尽管事实上仍然可以预测)


更多信息:

不久前,当使用外部Web服务检索巴西人的邮政编码数据(地址等)时,我遇到了这个问题。 我使用了与你完全相同的方法

有几点需要强调:

1) Ajax不允许安全协议差异。这意味着,如果您的页面使用安全协议(HTTPS)进行保护,您的浏览器将不允许外部服务器通过不安全协议(HTTP)返回。(我在开发的后期发现了这一点,结果是使用了.NET的webrequest)

2) 将数据类型设置为“JSONP”不会将响应转换为JSON。它允许它被如此接收

3) JSONP是唯一接受跨域请求的数据类型。您描述的错误消息可能是由于这个原因

因此,总结一下:

在使用ajax讨论跨域请求时,“任意”内容仅限于JSON(p)。接收的数据必须是JSON

此外,在jQuery1.5之前,如果响应没有正确地键入为JSON,则不会引发错误

我希望在我开始发展之前就知道这些问题。。。在不知道从SSL分层服务器请求HTTP中存储的数据这一事实的情况下,将组件上载到生产服务器是一件非常尴尬的事情。。。(尽管事实上仍然可以预测)


有关更多信息:

感谢您的回复。非常有用。我决定采用代理方法,我在这里找到了一个简单的解决方案:

为了简化剪切和粘贴,我在这里添加了代码

我创建了一个名为crossdomain.html的文件。包括jquery库。创建了以下Javascript函数:

function requestDataByProxy()
    {
        var url = "http://UrlYouWantToAcccess.html";
        var data = "url=" + url + "&parameters=1&para=2";    

        $.ajax({
            url: "our_domain_url.php",
            data: data,
            type: "POST",
            success: function(data, textStatus, jqXHR){
                console.log('Success ' + data);
                $('#jsonData').html(data);
            },
            error: function (jqXHR, textStatus, errorThrown){
                console.log('Error ' + jqXHR);
            }
        });
    }
我还添加了一个简单的按钮和HTML中的pre标记以加载结果:

<button onclick="requestDataByProxy()">Request Data By Proxy</button>

<h3>Requsted Data</h3>
<pre id="jsonData"></pre>
通过代理请求数据
要求的数据
然后是PHP文件我们的_domain_url.PHP,它使用cURL(请确保已启用此功能!)


对我来说,这是一个相当直接的解决方案

希望这对其他人有帮助


罗布

感谢您的回复。非常有用。我决定采用代理方法,我在这里找到了一个简单的解决方案:

为了简化剪切和粘贴,我在这里添加了代码

我创建了一个名为crossdomain.html的文件。包括jquery库。创建了以下Javascript函数:

function requestDataByProxy()
    {
        var url = "http://UrlYouWantToAcccess.html";
        var data = "url=" + url + "&parameters=1&para=2";    

        $.ajax({
            url: "our_domain_url.php",
            data: data,
            type: "POST",
            success: function(data, textStatus, jqXHR){
                console.log('Success ' + data);
                $('#jsonData').html(data);
            },
            error: function (jqXHR, textStatus, errorThrown){
                console.log('Error ' + jqXHR);
            }
        });
    }
我还添加了一个简单的按钮和HTML中的pre标记以加载结果:

<button onclick="requestDataByProxy()">Request Data By Proxy</button>

<h3>Requsted Data</h3>
<pre id="jsonData"></pre>
通过代理请求数据
要求的数据
然后是PHP文件我们的_domain_url.PHP,它使用cURL(请确保已启用此功能!)


对我来说,这是一个相当直接的解决方案

希望这对其他人有帮助


Rob

您需要使用Ajax跨源jQuery插件

这个插件允许您跨域使用jQuery.ajax()

像这样使用它:

$.ajax({
    crossOrigin: true,
    url: url,
    success: function(data) {
        console.log(data);
    }
});

您可以在这里阅读更多内容:

您需要使用Ajax跨源jQuery插件

这个插件允许您跨域使用jQuery.ajax()

像这样使用它:

$.ajax({
    crossOrigin: true,
    url: url,
    success: function(data) {
        console.log(data);
    }
});

您可以在此处阅读更多内容:

如果远程服务器没有明确提供JSONP响应,那么您唯一能做的就是通过自己的服务器代理这些请求,这样SOP就不适用了。如果远程服务器没有明确提供JSONP响应,那么您唯一能做的就是通过自己的服务器代理这些请求,重要提示:对JSONP请求的响应不是JSON。重要提示:对JSONP请求的响应不是JSON。相反,这是一个问题