如何使用jQuery在不同端口发送AJAX请求?

42

我需要向端口8080发送一个AJAX请求,该端口运行着一个守护进程。

3个回答

43

这会违反同源策略(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发出请求来提供服务。
如果你正在使用IIS,你可能想要使用Managed Fusion URL Rewriter and Reverse Proxy来设置反向代理。

1
+1 非常棒的回答。我回答了“啦啦啦”那种套话,而你提供了一个非常可行的解决方案。谢谢 Daniel! - Doug Neiner
哦,代理会在服务器端造成额外的处理。所以我会选择使用JSONP。 - user198729
在我找到这个之前,我已经挠了几天头,试图弄清楚为什么我无法跨端口发布数据。谢谢你,伙计。 - screenm0nkey
4
嘿,CORS怎么样? - tObi

31

如果你在跨域、子域或不同端口发送请求,你将无法进行 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进行跨域通信。


2
有没有一种通用的方法来替换 domain.com?这样它只能在生产环境中工作,因为我在开发环境中使用 localhost - user198729
6
您可以使用'http://' + window.location.hostname + ':8080/url'来构建既可以在本地又可以在线上运作的URL。 - Doug Neiner

2

即使您在同一台计算机上,只是使用不同的端口,这也算作不同的来源。

如果您主要面向像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.aspxhttp://msdn.microsoft.com/en-us/library/cc288060(VS.85).aspx


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