Ajax 在 Internet Explorer 9 中更改域名后停止工作
Ajax stops working after changing domain name in internet explorer 9
我们正在开发一个使用 html5、jQuery(1.8.2) 和 jQuery mobile 的移动网站,同时进行 jQuery ajax 调用(get 和 post)。
更改域名后,我们在 ie9 上的 ajax 调用出现"访问被拒绝"。
我们试图包括jquery.iecors.js
.但是我们仍然遇到同样的错误。对此有什么解决方案吗?
示例代码:
$.support.cors = true;
$.ajax({
cache: false,
async: true,
crossDomain: true,
timeout: 600000,
url: baseUrl + '/SmartTouch/restServices/PrefferedHotels',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Basic " + myencoded);
},
contentType: "application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8",
success: function (data) {
alert("success");
},
error: function (jqXHR, textStatus, errorThrown) {
alert("error!!::" + JSON.stringify(jqXHR));
alert('response: ' + jqXHR.responseText);
alert('code: ' + jqXHR.getResponseHeader('X-Subscriber-Status'));
alert("textStatus " + textStatus);
alert("errorThrown " + errorThrown);
}
});
编辑:
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Basic " + myencoded);
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");
},
contentType: "application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8",
success: function (data) {
alert("success");
},
error: function (jqXHR, textStatus, errorThrown) {
alert("error!!::" + JSON.stringify(jqXHR));
IE9 中的请求和响应标头:
Request:
Key Value
Request GET url HTTP/1.1
Accept text/html, application/xhtml+xml, */*
Accept-Language en-US
User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding gzip, deflate
Proxy-Connection Keep-Alive
Host ("url")
Pragma no-cache
Cookie GUEST_LANGUAGE_ID=en_US; COOKIE_SUPPORT=true; __utmc=24444716; __utma=24444716.47018335.1379597653.1380274476.1380276859.17; __utmz=24444716.1379597653.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=24444716.6.10.1380276859
Response:
Key Value
Response HTTP/1.1 200 OK
Server Apache-Coyote/1.1
X-Powered-By Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Accept-Ranges bytes
ETag W/"64578-1380266616000"
Last-Modified Fri, 27 Sep 2013 07:23:36 GMT
Content-Type text/html
Date Fri, 27 Sep 2013 10:17:01 GMT
Content-Length 64578
Age 0
Via 1.1 localhost.localdomain
Content-Type
看起来很奇怪:
application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8"
我可以想象IE有问题。
尝试正确的:
application/x-www-form-urlencoded; charset=UTF-8
^-- notice: no dot!
IE 也可能在授权方面遇到问题。也许myencoded
超出了范围或未正确填写。调试此变量并查看以下问题:通过 setRequestHeader
如果您希望从任何域访问 Ajax url,服务器必须发送响应标头 Access-Control-Allow-Origin : * 或 Access-Control-Allow-Origin : 您的域(如果仅限于您的域)。你能看到这些标题作为响应吗?
请参阅这篇关于 IE8 和 IE9 上 CORS 实现Microsoft文章:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
具体来说,他们说两件事:
- 不能向请求添加自定义标头
和
- 请求不会发送身份验证或 cookie
您在评论中提到:
我们的问题是我们正在做基本授权,包括以下标头:xhr.setRequestHeader("授权", "基本" + myencoded);在我们的阿贾克斯电话中。但是在ie9中,我们的访问被拒绝。有没有办法包含这个标题?
不幸的是,我必须给你的答案是否定的,没有办法在IE8或IE9中包含这个标头。Microsoft这样设计的。
要让它在IE9上与CORS一起工作,你必须说服你连接到的站点允许你以其他方式发送授权信息 - 可能是查询参数或发布数据。
如果站点不合作,则始终存在请求代理解决方法,即您请求到服务器上的页面,然后服务器使用正确的标头等转发请求。
您似乎确信该问题与建议的jQuery错误无关(特别是因为您使用的是jquery.iecors.js
),所以我将继续前进。
-
"编辑"位的意义是什么?
Access-Control-Allow-Origin:*
应该在响应上设置(即服务器端,作为 Apache/IIS/F5 配置的一部分),而不是在请求上设置。编辑:MDN上有更多可用的信息;如果您无法立即访问配置更改,您也可以使用 Burp 的篡改代理之类的东西来处理标头(在企业环境中很常见) -
即使不是问题,@DanFromGermany也是绝对正确的 - 内容类型看起来确实很奇怪。您甚至不必手动设置它,
jQuery.ajax()
默认情况下它是正确的。 -
您似乎还关心设置基本身份验证标头。请记住,
myencoded
值只是编码(未加密)的,因此您不妨跳过标头并在 URL 中传递凭据:http(s)://username:password@www.example.com/
摩尔编辑:
浏览上面的那些 MDN 文档,这似乎是相关的:
默认情况下,在跨站点 XMLHttpRequest 调用中,浏览器将 不发送凭据。 必须在 XMLHttpRequest 对象在被调用时。
也许尝试将xhr.withCredentials = true;
添加到您的beforeSend
中?
重要说明:响应凭证请求时,服务器必须指定域,并且不能使用通配符。 上面的例子 如果标头为通配符,则失败,如下所示: 访问控制允许来源:*。 由于访问控制允许来源 明确提到 http://foo.example,证书认知 内容将返回到调用的 Web 内容。
这将使先前在标题中使用星号的建议无效(即需要显式域)
使用的是基于Windows的托管?
请检查 IIS 的旧配置(如果可用),
有一些安全规定将允许按其类型划分的内容,
在页面中添加此响应标头<% Response.AddHeader("Access-Control-Allow-Origin","*") %>
。
或参阅 MSDN 的源链接以获取更多详细信息
我认为您已经在编辑中更新了它,但是涉及AJAX有很多事情,并且如果您的IE9更改了安全选项而不是默认值,则也可能是原因之一。
我认为应该可以,如果没有,请回复
你可以试试这个
<meta http-equiv="X-UA-Compatible" content="IE=Edge" >
它强制浏览器以最新版本的标准进行渲染。供参考 http://msdn.microsoft.com/en-us/library/ie/ms533876%28v=vs.85%29.aspx
- jQuery UI自动完成突然停止工作
- JavaScript打印功能使日历停止工作
- 下拉列表在使用z索引放置在前面后停止工作
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- 注入工厂时,Angular停止工作
- React Native DeviceEventEmitter键盘WillShow停止工作
- JavaScript在更改css时停止工作
- Chrome地理定位在更新后停止工作
- 重新启动jquery脚本后,角度停止工作
- twitter引导崩溃在第一次点击后停止工作
- 更新Wordpress和我的平滑滚动停止工作
- Hammer.js过了一段时间就停止工作了
- 应用程序在“关闭”之后停止工作(控制台中没有错误);咕哝的构造”;
- 当我添加JavaScript时,链接按钮停止工作
- NetBeans调试突然停止工作
- 某些Magento后端管理按钮已停止工作
- 表单验证在接近尾声时停止工作
- 为什么在ASP.NET Ajax更新面板中执行任何操作后javascript元素都停止工作
- 在html文件中添加了多个外部javascript,其中一个停止工作
- Ajax 在 Internet Explorer 9 中更改域名后停止工作