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

Posted

技术标签:

【中文标题】如何使用 jQuery 在不同的端口上发送 AJAX 请求?【英文标题】:How do I send an AJAX request on a different port with jQuery? 【发布时间】:2011-01-07 04:03:41 【问题描述】:

我需要将 AJAX 请求发送到例如运行守护程序的端口 8080。

【问题讨论】:

【参考方案1】:

这打破了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 获得出色的答案。我回答了书面的“blah blah blah”罐头回复,您提供了一个非常可行的解决方案。谢谢丹尼尔! 哦,proxy会在服务器端造成额外的处理。所以我会选择jsonP 在我发现这个之前,我一直在四处寻找,试图找出为什么我不能跨端口发布数据。谢谢大佬。 嘿,CORS 呢?【参考方案2】:

您不能POST 信息跨域、子域或端口号。但是,如果您可以访问守护程序 请求站点,则可以使用 JSONP。如果需要返回数据,则daemon 需要支持callback 查询参数并以正确的格式返回。

将信息传递给守护进程:

$.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 您应该能够使用'http://' + window.location.hostname + ':8080/url' 构建在本地和在线都可以使用的 URL。【参考方案3】:

这算作不同的来源,即使您将它放在同一个盒子上,只是端口不同。

如果您主要针对 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

【讨论】:

以上是关于如何使用 jQuery 在不同的端口上发送 AJAX 请求?的主要内容,如果未能解决你的问题,请参考以下文章

前端跨域之Jsonp的原生请求和Jquery的ajax请求,简单易懂。

无法在 Jquery ajax 调用中发送大数据

如何在 Objective-C 中监听网络端口

终止jQuery的$.ajax方法abort

我可以在与从该端口加载的脚本文件不同的端口上使用 XMLHttpRequest 吗?

创建对 PHP 函数的 jQuery AJAX 请求