【发布时间】:2011-03-18 10:22:35
【问题描述】:
这让我发疯了。
jQuery 1.4.2,Windows XP sp3
这是我的测试。
加载firefox 3.5+
http://plungjan.name/test/testcors.html
作品
将文件保存到硬盘并从那里运行
在我的办公室里,外部有效,内部无效
另外有趣的是,我不能同时跑两个。
背景: 我对使用CORS 的内部Web 服务执行GET。 请不发布任何关于 FF 自 v3.5 以来未处理跨域请求的答案,详细信息 here 和 here
它在 IE8 和 FF3.6.6 中从一台服务器到另一台服务器,现在几乎从文件系统 (file:///) 到服务。 仅来自文件系统和仅当 FF 3.6.6 需要协商(用户已经登录、授权并发送凭据!)协商后我是不是拿不到数据。 jQuery xhr 返回状态 0 并且没有数据/响应文本或其他 在我看来,jQuery 会做出反应并从 401 中保存 xhr,而不是稍后从 200 中保存
这是我在通信结束时提醒 XHR 对象时得到的结果:
Status:success
Data:[]
XHR:
some native functions,
readyState:4
status:0
responseXML:null
responseText:
withCredentials:true
如果我调用同一台服务器但不需要凭据,则数据会很好地跨域返回
所以通讯如下:
GET /restapplicationusingcors/authenticationneeded-internal/someid
Accept: application/json
Accept-Language: en
.
.
Origin: null
Cookie: LtpaToken=...
回报是
HTTP/1.1 401 Unauthorized
Server: Apache
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET
WWW-Authenticate: Negotiate
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
然后FF发送
GET /restapplicationusingcors/authenticationneeded-internal/someid HTTP/1.1
Host: myhost.myintranet.bla
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept: application/json
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: null
Cookie: LtpaToken=....
Authorization: Negotiate ....
并获得了我需要的文件,但在 FF 中无法获取:
HTTP/1.1 200 OK
Date: Tue, 20 Jul 2010 12:08:39 GMT
Pragma: No-cache
Cache-Control: no-cache, max-age=600, s-maxage=3600
Expires: Thu, 01 Jan 1970 01:00:00 CET
X-Powered-By: ...
Content-Disposition: inline;filename=nnnnnn.json
Content-Language: en
Access-Control-Allow-Origin: ...
Keep-Alive: timeout=6, max=70
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json;charset=UTF-8
从服务器发送的数据不在 XHR 对象中
这是我的代码
function getJSON(url,func,lang) {
accept = 'application/json';
lang=lang?lang:"*";
// gruesome hack to handle that APPENDS the mime header to */* !!!
// NOW HANDLED by first setting Accept to "" !!!
// if ($.browser.msie && url.indexOf('serveAsMime')==-1) {
// url+= '?serveAsMime='+accept;
// }
if (currentRequest != null) currentRequest.abort();
var requestObjectJSON = {
url : url,
// dataType: "json",
method : 'get',
beforeSend: function(xhr){
xhr.setRequestHeader('Accept', ""); // IE hack
xhr.setRequestHeader('Accept', accept);
xhr.setRequestHeader('Accept-Language', lang);
if (url.indexOf('-internal') !=-1) {
try {
xhr.withCredentials = true;
alert('set credentials')
}
catch(e) {
alert('cannot set xhr with credentials')
}
}
},
success: function(data,status,xhr) {
var responseText = xhr.responseText;
var responseJSON = xhr.responseJSON;
var t = "";
try{
for (var o in xhr) t += '\n'+o+':'+xhr[o];
}
catch(e) {
if (e.message.indexOf('.channel')==-1)alert(e.message);
}
alert('Status:'+status+'\nData:['+data+']\nXHR:'+t);
func(responseText);
},
}
currentRequest = $.ajax(requestObjectJSON);
}
【问题讨论】:
-
“将文件保存到硬盘并从那里运行。在我的办公室里,外部工作正常,内部工作不工作。”我不明白。外部/内部什么有效?
-
重新标记。如果你使用更流行的标签,你会得到一些答案.. ;)
-
...和一个更具描述性的问题标题。
-
您是否检查过任何公司防火墙和/或安全软件?我遇到了 jQuery/Ajax 问题,公司安全措施正在检测 Ajax 请求并阻止它们——我最终遇到了与您所得到的类似的错误。这可能是一个远景,因为情况有些不同,但这是一个想法。
-
标题比一个星期更具描述性!标签具有代表性。 Nathan:防火墙完全没有问题,因为原始代码在防火墙内运行。
标签: javascript json authentication jquery cors