我正在尝试对外部域进行AJAX调用。读了一点之后,我意识到这是不可能的。我开始深入研究proxys解决方案,但后来我发现了关于"跨站点xmlhttprequest with CORS"的信息
然后,从这里我明白了,也许非旧浏览器已经实现了一种方法来做到这一点,我想只要目标域允许。
因此,在这种模糊的情况下,我决定检查正在捕获的HTTP标头。
这是一份GET请愿书
http://www.genome.jp/dbget-bin/www_bconv?dbkey=uniprot&acc=P11730
使用任何浏览器,我都可以得到我想要的网页,但通过AJAX调用,我得到的状态为0。
但是,使用AJAX脚本和firefox附加组件LiveHTTP头,我可以看到一切似乎都很顺利
http://www.genome.jp/dbget-bin/www_bconv?dbkey=uniprot&acc=P62071
GET /dbget-bin/www_bconv?dbkey=uniprot&acc=P62071 HTTP/1.1
Host: www.genome.jp
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: null
HTTP/1.1 302 Found
Date: Sat, 28 Jan 2012 19:24:24 GMT
Server: Apache
Location: /dbget-bin/www_bget?mmu:66922
Content-Length: 0
Keep-Alive: timeout=60, max=1000
Connection: Keep-Alive
Content-Type: text/plain
因此,有两种选择:
1) 它正在工作,但代码有某种错误
2) 它看起来是有效的,但实际上AJAX不能对外部域进行。为什么Live HTTP头捕获了好东西?因为审查是事后进行的。
答案是什么?
(javascript代码)
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
alert(xmlhttp.readyState+' '+xmlhttp.status)
if (xmlhttp.readyState==4)
{
alert(xmlhttp.responseText);
}
}
if("withCredentials" in xmlhttp)
{
xmlhttp.open("GET","http://www.genome.jp/dbget-bin/www_bconv?dbkey=uniprot&acc=P11730",true);
xmlhttp.withCredentials = "true";
xmlhttp.onreadystatechange = handler;
xmlhttp.send();
}
}
</script>
</head>
<body>
编辑:所以使用CORS需要在web服务器上启用额外的标头。那么我认为是选项2)。
有趣的链接
规避同源政策的方法
http://anyorigin.com/
http://enable-cors.org/
http://remysharp.com/2011/04/21/getting-cors-working/
您的假设是正确的。
与流行的观点相反,总是可以向外部域发送XMLHttp请求。但是,javascript不允许访问响应文档。
这是由于的同源政策
同源策略防止从一个源加载的文档或脚本从另一个源获取或设置文档的属性。
正如您所发现的,如果服务器同意通过设置相应的标头来授予访问权限,则此限制不适用(前提是浏览器也支持CORS)。