我正在寻找一种方法,允许浏览器托管的JS应用程序使请求服务器运行在不同的端口,可能,不同的机器比这是在第一个地方服务的JS应用程序。
我服务于一个简单的JavaScript (HTML5)应用程序从我的Mac OS X Apache web服务器。我希望能够在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);
我得到这两个错误:
拒绝设置不安全的报头"User-Agent"
XMLHttpRequest无法加载
http://10.0.1.3:49379/find?name=Fred
。原产地http://10.0.1.3
不允许Access-Control-Allow-Origin .
我已经控制了Apache服务器,JavaScript和自定义服务器。这只是一个概念验证,将在孤立的网络上进行演示。所以,我不关心安全问题。
此外,我在Chrome, Firefox, Safari中运行。所有这些似乎都使用XMLHttpRequest2对象。
我找到了绕过CORS的方法是使用jsonp -这是带有回调函数的json -我从未将其与XMLHttpRequest一起使用,但它可以与jQuery ajax函数(如$.getJSON
)一起使用。在url查询字符串中,只需添加参数jsoncallback=?
,瞧,没有更多的CORS问题。$.getJSON
动态地将其success
参数赋值给回调函数