【问题标题】:How to do cross domain ajax in jQuery with dataType 'text'?如何使用 dataType 'text' 在 jQuery 中进行跨域 ajax?
【发布时间】:2011-08-23 07:13:44
【问题描述】:

在我的 javacript 函数中,我称之为 ajax。它工作正常,但只有当我从firebird 服务器访问网页时。我的testing 服务器上有相同的代码。 ajax 要求下载一些文件,但只有 firebird 服务器向我们的客户端注册了它的 ip,以便能够在那里进行 scp。如果我从测试服务器访问 php 文件,我也需要这样做。所有服务器都在 Intranet 内。

  • 是否可以使用 dataType text 来做到这一点?
  • 我需要在服务器端进行任何更改吗?

ajax 调用:

url = "https://firebird"+path+"/tools.php?";    

jQuery.ajax({
    type: 'get',
    dataType: 'text',
    url: url,
    data: {database: database_name, what: 'download', files: files, t: Math.random() },
    success: function(data, textStatus){
        document.getElementById("downloading").innerHTML+=data;
    }
});

更新 1

我的小型 Web 应用程序可以恢复数据库,因此我可以对它们进行测试。现在我想增强它,这样我就可以连接到我们的客户并下载特定的备份。我们的客户只允许firebird 服务器连接到他们的网络。但我有自己的服务器专用于testing。所以每次我想下载一个数据库我都需要连接firebird。我的 Web 应用程序的源和包含所有备份的文件夹都安装在两个服务器 firebirdtesting 上的相同位置。现在我的解决方案(用于下载)有效,但只能来自 firebird。我基本上只工作testing 服务器。

更新 2

我进行了两次 ajax 调用。一种是纯 jQuery 调用(我想我可以对这个应用任何解决方案),另一种是来自 jsTree 的 ajax 调用。我为那个创建了new question。在我看来,I have to 选择 @zzzz 的选项 b)。

【问题讨论】:

  • 唯一可以进行的跨域调用(没有服务器端代理)是jsonp 调用。 text 将不起作用。我不确定我是否正确理解了 SCP 部分。你能详细说明一下吗?
  • @Mrchief :请参阅更新 1
  • @Malvolio:除了情节剧,有什么问题吗? @William Niu` 重申了我的想法(仔细看看他回答的第一行)。他还提到了 CORS,这就是为什么他的答案是我的评论。
  • @Mrchief -- 怎么了?你写“你可以做的唯一类型的跨域调用(没有服务器端代理)是 jsonp 调用”。事实并非如此。 CORS 也是一种解决方案(在我谦虚但完全准确的意见中,这是一种优越的解决方案)并且不需要服务器端代理。 JSONP 的唯一优势是它可以在侏罗纪浏览器中运行,因此如果您需要支持 Amish 或 Colonial Williamsburg 之类的......
  • @Malvolio:这并不完全准确。 CORS 在 Opera 和 IE 8 中具有部分支持,并且完全使用不同的实现 (XDomainRequest)。不要仅仅因为您的客户没有抱怨,就认为 CORS 的一切都是完美的。不管你信不信,世界上很大一部分人仍在使用侏罗纪浏览器。撇开事实不谈,重点是,您通常会在完整的答案中提及这类事情,而不是在评论中。

标签: javascript ajax jquery cross-domain


【解决方案1】:

要进行跨域请求,您的选择相当有限。正如@Mrchief 提到的,您可以使用server side proxyjsonp

另一个选项是Cross-Origin Resource Sharing (CORS),一个 W3C 工作草案。引用this blog post

CORS 背后的基本思想是使用自定义 HTTP 标头来允许两者 浏览器和服务器相互了解足够多 确定请求或响应应该成功还是失败。

对于一个简单的请求,使用 GET 或 POST 而没有自定义 headers 并且其正文是 text/plain,请求以 额外的标题称为 Origin。 Origin 标头包含原点 请求页面的(协议、域名和端口),以便 服务器可以很容易地确定它是否应该提供响应。

您可以在 this site 上找到一些实时示例。

您需要对服务器端进行更改以接受 CORS 请求。由于您可以控制服务器,因此这应该不是问题。 CORS 的另一个缺点是,它可能与旧版浏览器不兼容。因此,如果您的一些重要受众使用不兼容的浏览器,那么服务器端代理实际上可能是您更好的选择。

【讨论】:

  • 我已经运行支持 CORS 的网站一年多了,我从未有客户抱怨他的浏览器无法使用它。它尽可能接近完美。唯一的障碍当然是,微软的那些白痴搞砸了他们的实现,所以你必须围绕他们的错误进行设计。
【解决方案2】:

我只是想提供一个替代方案。

我不太确定您的网络设置,但如果您可以访问 DNS,那么如果您只为您的服务器提供同一域的任意子域,也许最简单。类似于www.foo.com 用于webfront 和firebird.private.foo.com 用于firebird 服务器。这样,它就变成了跨子域而不是跨域。然后在两个页面的 JavaScript 中某处,

document.domain = "foo.com";

这位先生实现了这个解决方案here

【讨论】:

    【解决方案3】:

    您有以下选择

    a) 您使用 jsonp 类型作为您的数据类型,但这涉及在服务器端进行更改以将数据作为 json 而不是 txt.. 这种更改可能像

    一样简单
    {
      "text":<your current text json encoded> 
    }
    

    在您的 js 端,您将其用作 response.text;话虽如此,如果您从 sm 其他域获取文件的文本,我不确定您更改代码有多容易。

    b) 另一种选择是您在服务器上编写一个处理程序/端点,即在您的域内,它将向第三个域发出 HTTP 请求获取文件,然后您将文件发送回您的客户端,现在您的客户端有效仅与您的域对话,您可以控制一切。由于大多数 yoyr 问题都是基于 ruby​​,这里是一个例子:

    req = Net::HTTP.get_response(URI.parse('http://www.domain.com/coupons.txt'))
    
    @play = req.body
    

    您可以找到有关同一here.的更多详细信息

    希望这会有所帮助。

    【讨论】:

    • 我使用了您的选项b),这是我在发布此问题之前想到的,希望会有其他解决方案....
    • Radek,仅供参考,选项 b 也称为服务器端代理,您基本上可以通过您可以访问的端点中继请求和响应。
    • @Radek 不要我得到赏金.. :/ :P
    【解决方案4】:

    另一个想法是使用您的网络服务器作为代理。您需要考虑此路由的安全隐患。

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2012-07-29
      • 2013-07-28
      • 2012-08-01
      • 2011-07-27
      相关资源
      最近更新 更多