在Internet Explorer 9中更改域名后,Ajax停止工作

7
我们正在使用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 

1
baseUrl 是硬编码的吗?还是从 HTML 输出中获取的? - Jorge Y. C. Rodriguez
你是否正在请求来自同一域的页面? - Jamil Hneini
1
似乎答案在这里给出:https://dev59.com/h2kv5IYBdhLWcg3w9lai - Vytautas Butkus
1
@ Vytautas 我们尝试了此链接中提供的所有选项,但都没有起作用。我们的问题是我们正在执行基本授权并在我们的ajax调用中包含以下标头:xhr.setRequestHeader(“Authorization”,“Basic”+ myencoded); 但在ie9中,我们遇到了访问被拒绝的问题。有没有办法包含这个标头? - user1533947
你收到了什么错误?只有"拒绝访问"还是还有其他的错误? - MarmiK
显示剩余6条评论
6个回答

2
这种类型的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进行授权


1
我想不出任何情况下myencoded会在IE9以外的其他浏览器上正确地作用于范围。但是再次强调,这是IE。确认了我的对Content-Type的疑虑,加1! - Oleg

1

你似乎很有信心这个问题与建议的jQuery bug无关(尤其是因为你正在使用jquery.iecors.js),所以我会立即处理。

  • “edited”位的意义是什么?Access-Control-Allow-Origin:*应该在响应中设置(即服务器端,作为Apache/IIS/F5配置的一部分),而不是在请求中设置。编辑:MDN上提供了更多信息;如果您没有立即访问配置更改的权限(在企业环境中非常普遍),您还可以使用类似burp的篡改代理来玩弄标头

  • 即使不是问题,@DanFromGermany绝对正确——content-type看起来确实很奇怪。您甚至不必手动设置它,jQuery.ajax()默认就是正确的。

  • 您似乎也关心设置基本身份验证标头。请记住,myencoded值只是编码(而不是加密),因此您可以跳过标头并在URL中传递凭据http(s)://username:password@www.example.com/

更多编辑:

浏览上述 MDN 文档,这似乎很相关

默认情况下,在跨站点 XMLHttpRequest 调用中,浏览器不会发送凭据。当调用 XMLHttpRequest 对象时,必须设置特定标志。

也许尝试将 xhr.withCredentials = true; 添加到你的 beforeSend 中?

重要提示:当响应凭证请求时,服务器必须指定一个域,并且不能使用通配符。如果标题是通配符,比如 Access-Control-Allow-Origin: *,则上述示例将失败。因为 Access-Control-Allow-Origin 明确提到 http://foo.example,所以凭证感知内容将返回给调用的 Web 内容。

这将使之前的建议无效(即需要显式指定域)。


@ o.v. 我们需要在服务器端的哪里设置标题?我们如何在响应中设置它?在我们的情况下,响应是JSON。 - user1533947

1

请看这篇微软文章,介绍了在IE8和IE9上实现CORShttp://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

具体来说,它们提到两件事:

  • 不能向请求中添加自定义头

以及

  • 不会随请求发送身份验证或cookie

你在评论中提到:

我们的问题是我们正在执行基本授权,并在我们的ajax调用中包括以下标头:xhr.setRequestHeader("Authorization", "Basic " + myencoded); 但是在ie9中,我们遇到了访问被拒绝的问题。有没有办法包含此标头?

不幸的是,我必须告诉你的答案是否定的,在IE8或IE9中没有办法包含此标头,这是微软设计的。

要使其与IE9上的CORS正常工作,您需要说服所连接的站点以其他方式允许您发送授权信息 - 可能是查询参数或POST数据。

如果网站不合作,总有一种请求代理的解决方法,您可以向服务器请求一个页面,然后您的服务器会带着正确的头信息转发请求。

1
如果您希望从任何域名访问Ajax url,则服务器必须发送响应头Access-Control-Allow-Origin : *Access-Control-Allow-Origin : your-domain(仅限于您的域名)。您能在响应中看到这些头吗?

根据@Maz提供的链接,我认为那就是问题所在。 - Gurminder Singh
@ Gurminder 我们可以看到请求和响应头。那里需要检查什么? - user1533947
你能告诉我在这个请求中你将要实现什么,以及你的 Web 服务返回和接受什么 contentType 吗? - Gurminder Singh
我们正在调用一个返回JSON对象的RESTful Web服务。我们使用的内容类型是:contentType:"application / x-www-form-urlencoded; (http://www.form-urlencoded;) charset = UTF-8",我们还设置了一个请求头:beforeSend:function(xhr){xhr.setRequestHeader("Authorization","Basic "+ myencoded);}。这是否会在XDR中引起问题?因为我们已经看到XDR不允许自定义头部。 - user1533947
我们已经包含了以下js文件:jquery-1.7.2.min.js,CryptoJS.js和/jquery.iecors.js。Ajax是:$ .ajax({ url:baseUrl +'SmartTouch/restServices/CityCodes', type:'GET', async:true, cache:false, crossDomain:true, beforeSend:function(xhr){xhr.setRequestHeader("Authorization","Basic"+ myencoded)}, contentType:“application/json”, success:function(data){ alert(“成功”); }, error:function(jqXHR,textStatus,errorThrown){ alert(“错误!!::”+ JSON.stringify(jqXHR));} }); });我们仍然无法访问。基本授权标头是否导致问题? - user1533947
显示剩余19条评论

0

@ Shafeeq 我已经添加了这个,但没有运气。 - user1533947

0

如果您正在使用基于Windows的托管?

请检查旧的IIS配置,如果可用,

有安全规定将允许按其类型发布内容,

在您的页面中添加此响应头<% Response.AddHeader("Access-Control-Allow-Origin","*") %>

或者参考MSDN源链接获取更多详细信息。

我认为您已经在编辑中更新了这个问题,但是由于涉及到AJAX,还有可能是IE9的原因,如果您更改了安全选项而不是默认选项。

我认为这样做就可以了,如果不行,请回复。


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