我需要向端口8080发送一个AJAX请求,该端口运行着一个守护进程。
我需要向端口8080发送一个AJAX请求,该端口运行着一个守护进程。
这会违反同源策略(Same origin policy)。即使在使用相同的域名时,也不能使用不同的端口。
你可以像Doug建议的那样使用JSONP。
或者,作为另一个可能的解决方法,您可以设置一个非常简单的反向代理(Reverse proxy)(如果您使用Apache,则使用mod_proxy)。这将允许您在AJAX请求中使用相对路径,同时HTTP服务器将充当任何“远程”位置的代理。
在mod_proxy中设置反向代理的基本配置指令是ProxyPass。您通常会按以下方式使用它:
ProxyPass /ajax/ http://www.localhost:8080/
在这种情况下,你会使用jQuery请求/ajax/test.xml
,但实际上服务器会在内部充当代理,代替你向http://www.localhost:8080/test.xml
发出请求来提供服务。如果你在跨域、子域或不同端口发送请求,你将无法进行 POST
操作。但是,如果你可以访问守护程序和请求站点,则可以使用 JSONP。如果需要返回数据,则 daemon
需要支持回调查询参数并正确格式化返回的数据。
将信息传递给守护程序:
$.getJSON('http://domain.com:8080/url/here?callback=?', {
key: 'value',
otherKey: 'otherValue'
}, function(data){
// Handles the callback when the data returns
});
现在只需要确保您的守护进程处理callback
参数即可。例如,如果callback=mycallback
,则来自守护进程的返回值(唯一写入页面的内容)应如下所示:
对于键/值对:
mycallback( {'returnkey':'returnvalue', 'other':'data' });
对于一个数组:
mycallback( [1,2,3] );
如果您没有JSONP或类似机制,您不能使用jQuery进行跨域通信。
domain.com
?这样它只能在生产环境中工作,因为我在开发环境中使用 localhost
。 - user198729'http://' + window.location.hostname + ':8080/url'
来构建既可以在本地又可以在线上运作的URL。 - Doug Neiner即使您在同一台计算机上,只是使用不同的端口,这也算作不同的来源。
如果您主要面向像FireFox 3.5及更高版本这样的新浏览器,可以尝试在另一个端口中为您的应用程序添加Access-Control
标头,并允许从默认应用程序池调用。有关访问控制标头的信息可以在此处找到:https://developer.mozilla.org/en/HTTP_access_control
IE也实现了它(再次使用不同的ACTIVEX控件,为什么?):http://blogs.msdn.com/ie/archive/2009/01/14/completing-access-control-support-for-xdomainrequest.aspx 和 http://msdn.microsoft.com/en-us/library/cc288060(VS.85).aspx