如何进行跨域请求

36

正如您所知,Web浏览器的安全性禁止进行跨域请求。我读了一本书,上面说如果您可以将文件放在服务器上(即将要加载的页面放在所请求的域上),则应仅使用XMLHTTPRequest。如果您不能这样做-您应该寻找替代方法。

我的问题是:

  1. XMLHTTPRequest的跨域替代方案是什么?
  2. 那WebSocket呢? 这种技术允许跨域请求吗?

编辑: 对我来说还不太清楚...

例如,我从www.domain1.com获取我的页面,并且我需要从www.domain2.com请求javascript。 所以拉取的页面应包括以下内容:

<script src="www.domain2.com/script.js"></script>

为了避免跨域限制。

我可以使用JSONP,请求将如下所示: http://ww.domain1.com/?callback=someFunction.js

但是:这不是一样的吗?我只是从另一个域中拉取js!它能避免跨域限制吗?


这篇MDN上的文章非常好地解释了跨域访问控制(CORS)的问题和解决方案。 - Liam
3个回答

22
您可以使用XMLHttpRequest对象进行跨域请求。这是通过一种称为“跨域资源共享”的技术实现的。详见:http://en.wikipedia.org/wiki/Cross-origin_resource_sharing 简单地说,当请求发送到服务器时,服务器会回复一个名为“Access-Control-Allow-Origin”的标头,该标头将允许或拒绝请求。浏览器需要检查此标头,如果被允许,则会继续请求过程。否则,浏览器将取消该请求。
您可以在此处找到更多信息和一个工作示例:http://www.leggetter.co.uk/2010/03/12/making-cross-domain-javascript-requests-using-xmlhttprequest-or-xdomainrequest.html JSONP是另一种解决方案,但可能有点欺骗性。

我认为这也有点像是一个hack。不过这并没有阻止我使用它!:D - Charles Wood
@CharlesWood 不要太天真了...一个安全的服务器会检查这个头部的值,然后决定是否允许该请求 ;) - Leo
@Leo 是的,我不知道当时在想什么 :D - Charles Wood

5

如何进行跨域AJAX调用

您的Web服务必须支持方法注入才能进行JSONP。

如果您的Web服务和Web应用程序托管在同一域中,则您的代码似乎很好,并且应该可以正常工作。

当您使用dataType: 'jsonp'进行$.ajax时,意味着jQuery实际上正在向查询URL添加一个新参数。

例如,如果您的URL是http://10.211.2.219:8080/SampleWebService/sample.do,那么jQuery将添加?callback={some_random_dynamically_generated_method}。

这个方法更像是一个代理,实际上附加在window对象中。这并没有什么特别之处,但看起来像这样:

window.some_random_dynamically_generated_method = function(actualJsonpData) {
    //here actually has reference to the success function mentioned with $.ajax
    //so it just calls the success method like this: 
    successCallback(actualJsonData);
}

请查看以下内容获取更多信息: 使用jQuery进行跨域ajax JSONP请求

是的,谢谢。但是你能回答一下编辑区域的问题吗? - VB_

4
如果你想传输一些数据而不需要保护信息(例如公共信息),你可以使用CORS代理,很容易操作,无需更改代码或服务器端任何内容(特别是如果不是你自己的服务器,比如雅虎API或OpenWeather)。 我曾经使用它来获取JSON文件并用XMLHttpRequest处理,效果良好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接