从浏览器托管的JavaScript应用程序到自定义服务器的跨源资源共享

时间:2013-03-07 17:52:10

标签: javascript xmlhttprequest cross-domain user-agent

我正在寻找一种允许浏览器托管的JS应用程序向服务器发出请求的方法,该服务器在不同的端口上运行,并且可能与首先提供JS应用程序的机器不同。

我从Mac OS X Apache Web服务器提供一个简单的JavaScript(HTML5)应用程序。我希望能够在Windows,Android和OS X中尽可能多地在多个浏览器中运行此应用程序。但我愿意在每个浏览器中安装一个。

我的JavaScript应用使用XMLHttpRequest发出返回JSON的最小自定义服务器的请求。

因此,例如,我的JS应用程序可以在http://10.0.1.3/poc/dashboard.html

访问

并且我的自定义服务器在同一台机器上运行,侦听端口49379 ...像http://10.0.1.3:49379/find?name=Fred这样的请求会返回一组元组,其中'name'等于'Fred'。

如果我直接在导航工具栏中输入此请求,那么我会得到所需的结果。

如果我在JS中提出相同的请求,我会遇到一些错误。

var theXHR = new XMLHttpRequest();
theXHR.onreadystatechange = onReadyStateHandler;
theXHR.open("GET", "http://" + ipAddress + ":49379/find?name=Fred", true);
theXHR.setRequestHeader("User-Agent", "XMLHTTP/1.0");
theXHR.send(null);

我得到了这两个错误:

  1. 拒绝设置不安全的标题“User-Agent”

  2. XMLHttpRequest无法加载http://10.0.1.3:49379/find?name=Fred。     来源http://10.0.1.3不被允许     访问控制允许来源。

  3. 我可以控制Apache服务器,JavaScript和自定义服务器。这只是将在隔离网络上演示的概念证明。所以,我不关心安全问题。

    此外,我在Chrome,Firefox,Safari中运行。所有这些似乎都使用XMLHttpRequest2对象。

1 个答案:

答案 0 :(得分:1)

我发现绕过CORS的方法是使用jsonp - 这是带有回调函数的json - 我从未在XMLHttpRequest中使用它,但它适用于jQuery ajax函数,如$.getJSON。在您的网址查询字符串中,只需添加参数jsoncallback=?即可,不再有CORS问题。 $.getJSON动态地将其success参数分配给回调函数。