我正在寻找一种允许浏览器托管的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);
我得到了这两个错误:
拒绝设置不安全的标题“User-Agent”
XMLHttpRequest无法加载http://10.0.1.3:49379/find?name=Fred
。
来源http://10.0.1.3
不被允许
访问控制允许来源。
我可以控制Apache服务器,JavaScript和自定义服务器。这只是将在隔离网络上演示的概念证明。所以,我不关心安全问题。
此外,我在Chrome,Firefox,Safari中运行。所有这些似乎都使用XMLHttpRequest2对象。
答案 0 :(得分:1)
我发现绕过CORS的方法是使用jsonp - 这是带有回调函数的json - 我从未在XMLHttpRequest中使用它,但它适用于jQuery ajax函数,如$.getJSON
。在您的网址查询字符串中,只需添加参数jsoncallback=?
即可,不再有CORS问题。 $.getJSON
动态地将其success
参数分配给回调函数。