AJAX无法处理302重定向。

4
我有一个存储在外部服务器上的数据库,我正在尝试进行查询。为此,我在我的本地服务器(Tomcat)上创建了一个AJAX调用(只是XMLHttpRequest对象 - 我没有使用任何JavaScript库)到带查询附加的页面。将完全相同的URL粘贴到Firefox中会导致它尝试下载一个XML文档。我的目标是使用AJAX获取那个XML文档。
我遇到的问题是,在使用AJAX发出调用时,Firebug显示GET响应返回302 "临时移动"和红色X。GET响应的头部具有带有OAuth授权的位置参数,当我复制并粘贴位置参数时,它将带我到正确的页面(告诉我下载XML对象)。
编辑: 我尝试使用jQuery的$.get("URL", function(data){alert(data)});,但出现相同的情况 - 没有弹出,但在Firebug中出现红色GET请求和302。
根据这些信息,我认为我正在调用的数据库首先尝试将我重定向到一些OAuth东西,然后返回一个授权URL,以便访问数据库。这就是我应该使用来调用数据库、获取XML对象并完成我的工作的内容。AJAX似乎无法处理重定向,而是崩溃了。
然而,我不确定这是否正确,因为我尝试使用以下代码:
  else if (xmlhttp.readyState == 4 && xmlhttp.status == 302){
  alert("Hello 302!");
}
else {
  document.getElementById("test").innerHTML = "On state: " + xmlhttp.readyState + "<br />HTTP Status: " + xmlhttp.status;
}

而没有弹出警告,它显示处于状态4和状态0。我不明白为什么会返回状态0。(编辑:已更正答案1中提到的拼写错误,但没有改变任何内容)
所以我的问题是:
- 到底发生了什么? - 状态0是什么,为什么Firebug在控制台中给我一个302旁边的X,为什么没有重定向? - 我该如何解决这个问题? - 一旦我解决了这个问题,我是否能够获取那个XML文件,或者还需要做其他事情?
更新后的编辑:这是一个跨站脚本攻击问题。我去了外部服务器并运行了完全相同的脚本,成功检索和解析包含查询结果的XML文档。唯一的障碍是如何从外部服务器执行此操作。我可以访问外部服务器的配置,并将研究如何操纵它以允许其他站点通过数据库查询访问它。

你能在这里贴一些代码吗?服务器端是否做了重定向? - Sameh Serag
3个回答

3

我已经发现了这个问题(请参见编辑),并在昨天提出了一个问题 - http://stackoverflow.com/questions/11195674/running-a-query-and-retrieving-xml-from-an-external-site/11195730#11195730如何进行数据拉取? - Andrew Latham
编写代码,可在您的服务器上运行(同一域),从外部数据库获取数据(由在您的服务器上运行的代码发出HTTP请求,而不是用户浏览器),并将其返回给您的ajax请求。 - c2h5oh

1

您有一个语法错误,readystate需要改为readyState。按照现在的写法,它永远不会是4。

另一个建议是只检查readyState是否为4,并在该语句中测试302的status。这样,您就可以排除是否是302导致了问题。


谢谢您指出这一点,但那些部分只是用于测试,并且只是我的测试的一部分 - 我还在每次状态改变时将状态和状态写入控制台 - 因此语法错误不是我在这里遇到问题的原因。302从未被写入控制台。 - Andrew Latham

0
尝试在服务器端进行重定向。
来自FireBug的快照。

See this snapShot

在这个快照中,Ajax请求被发送到服务器端(其中包含重定向)。

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