如何使用dataType'text'在jQuery中跨域ajax?

时间:2011-08-23 07:13:45

标签: javascript ajax jquery cross-domain

在我的javacript函数中,我称之为ajax。它工作正常,但只有当我从firebird服务器访问网页时。我的testing服务器上有相同的代码。 ajax要求下载一些文件,但只有firebird服务器有我们的客户端的ip寄存器才能scp那里。如果我从测试服务器访问php文件,我需要做同样的事情。所有服务器都在内部网中。

  • 是否可以使用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)。

4 个答案:

答案 0 :(得分:3)

要执行跨域请求,您的选项相当有限。如上所述@Mrchief,您可以执行server side proxyjsonp

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

  

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

     

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

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

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

答案 1 :(得分:2)

我只是想提供另一种选择。

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

document.domain = "foo.com";

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

答案 2 :(得分:1)

您有以下选项

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

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

在你的js方面你用它作为response.text;话虽如此,如果您从sm其他域获取文件的textis,我不确定您更改代码是多么容易。

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

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

@play = req.body

您可以找到有关相同here.

的更多详细信息

希望这有帮助。

答案 3 :(得分:0)

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