7

我们正在使用 html5、jQuery(1.8.2) 和 jQuery mobile 开发移动网站,同时进行 jQuery ajax 调用(获取和发布)。
在我们更改域名后,我们在 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 
4

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超出范围或未正确填写。调试这个变量,看看这个问题:Authorization through setRequestHeader

于 2013-09-26T09:49:36.310 回答
1

如果您希望从任何域访问 Ajax url,服务器必须发送响应标头Access-Control-Allow-Origin : *Access-Control-Allow-Origin : your-domain如果仅限于您的域。你能看到这些标题作为回应?

于 2013-09-23T06:59:25.240 回答
1

您似乎确信该问题与建议的 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?

重要提示:在响应凭据请求时,服务器必须指定域,并且不能使用通配符。如果标头通配符为:Access-Control-Allow-Origin: *,上述示例将失败。由于 Access-Control-Allow-Origin 明确提及http://foo.example,因此将凭据识别内容返回给调用 Web 内容。

这将使以前在标头中使用星号的建议无效(即需要显式域)

于 2013-09-27T04:36:23.890 回答
1

请参阅有关在 IE8 和 IE9 上实现 CORS 的 Microsoft 文章:http: //blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

具体来说,他们说了两件事:

  • 不得将自定义标头添加到请求中

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

你在评论中提到:

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

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

要让它在 IE9 上与 CORS 一起工作,您必须说服您要连接的站点允许您以其他方式发送授权信息 - 可能是查询参数或发布数据。

如果站点不合作,则始终存在请求代理解决方法,您可以在其中请求服务器上的页面,并且服务器使用正确的标头等转发请求。

于 2013-09-27T05:09:18.683 回答
0

你可以试试这个

<meta http-equiv="X-UA-Compatible" content="IE=Edge" >

它强制浏览器以最新版本的标准进行渲染。供参考http://msdn.microsoft.com/en-us/library/ie/ms533876%28v=vs.85%29.aspx

于 2013-09-27T07:08:01.820 回答
0

如果您使用的是基于 Windows 的主机?

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

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

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

或参考MSDN 的源链接以获取更多详细信息

我认为您已在编辑中对此进行了更新,但它涉及的 AJAX 有很多事情,如果您更改了安全选项而不是默认设置,您的 IE9 也可能是原因之一。

我觉得应该可以,如果不行请回复

于 2013-09-26T08:56:56.540 回答