[jquery] CORS가있는 IE9 jQuery AJAX가 “액세스가 거부되었습니다”를 반환합니다.

다음은 IE를 제외한 모든 브라우저에서 작동합니다 (IE 9에서 테스트 중입니다).

jQuery.support.cors = true;
...
        $.ajax(
            url + "messages/postMessageReadByPersonEmail",
            {
                crossDomain: true,
                data: {
                    messageId       : messageId,
                    personEmail     : personEmail
                },
                success: function() {
                    alert('marked as read');
                },
                error: function(a,b,c) {
                    alert('failed');
                },
                type: 'post'
            }
        );

을 사용하는 다른 함수가 dataType: 'jsonp'있지만이 AJAX 호출에서 반환 된 데이터가 필요하지 않습니다. 내 마지막 수단은 JSONP로 래핑 된 약간의 엉터리를 반환하는 것입니다.

IE가 데이터를 반환하지 않는 CORS 요청으로 망쳐 놓은 이유는 무엇입니까?



답변

이것은 jQuery 의 알려진 버그 입니다. jQuery 팀은 “이를 핵심으로 지원할 계획이 없으며 플러그인으로 더 적합합니다.” ( 이 주석 참조 ). IE는 XMLHttpRequest를 사용 하지 않고 XDomainRequest 라는 대체 개체를 사용합니다 .

있다 jQuery를에이 기능을 지원하는 데 사용할 플러그인, 여기에서 찾을 수 있습니다이 :
https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

EDIT
이 기능 $.ajaxTransport은 운송업자 공장을 등록합니다. 전송자는 요청을 수행하기 위해 내부적 으로 사용됩니다 $.ajax. 따라서 평소처럼 전화 할 수 있어야 한다고 생각 합니다 $.ajax. 운송 업체 및 확장에 대한 정보는 여기$.ajax 에서 찾을 수 있습니다 .

또한이 플러그인의 더 나은 버전은 여기 에서 찾을 수 있습니다 .

다른 두 가지 참고 사항 :

  1. 개체 XDomainRequest는 IE8 에서 도입되었으며 아래 버전에서는 작동하지 않습니다.
  2. IE10에서 CORS는 일반 XMLHttpRequest를 사용하여 지원됩니다 .

편집 2 : http to https 문제

요청은 호스팅 페이지와 동일한 체계를 대상으로해야합니다.

이 제한은 AJAX 페이지가
http://example.com 에있는 경우 대상 URL도 HTTP로 시작해야 함을 의미합니다. 마찬가지로 AJAX 페이지가 https://example.com 에있는 경우 대상 URL도 HTTPS로 시작해야합니다.

출처 : http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx


답변

@dennisg가 받아 들인 대답을 바탕으로 MoonScript의 jQuery.XDomainRequest.js 를 사용하여 성공적으로 수행했습니다 .

다음 코드는 Chrome, Firefox 및 IE10에서 올바르게 작동했지만 IE9에서는 실패했습니다. 스크립트를 포함하기 만하면 이제 IE9에서 자동으로 작동합니다. (아마 8 명이지만 테스트하지는 않았습니다.)

var displayTweets = function () {
    $.ajax({
        cache: false,
        type: 'GET',
        crossDomain: true,
        url: Site.config().apiRoot + '/Api/GetTwitterFeed',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (data) {
            for (var tweet in data) {
                displayTweet(data[tweet]);
            }
        }
    });
};


답변

“jQuery-ajaxTransport-XDomainRequest”플러그인을 사용하여이 작업을 수행하는 방법에 대한 전체 지침은 여기에서 찾을 수 있습니다.
https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

이 플러그인은 적극적으로 지원되며 HTML, JSON 및 XML을 처리합니다. 이 파일은 CDNJS에서도 호스팅되므로 추가 설정없이 스크립트를 페이지에 직접 드롭 할 수 있습니다.
http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest .min.js


답변

문제는 IE9 이하가 CORS를 지원하지 않는다는 것입니다. XDomainRequest는 GET / POST 및text/plain http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx에 설명 된대로 conten-type 합니다.

따라서 모든 HTTP 동사 및 / 또는 json 등을 사용하려면 다른 솔루션을 사용해야합니다. IE9 이하가 사용되는 경우 프록시로 정상적으로 다운 그레이드되는 프록시를 작성했습니다. ASP.NET을 사용하는 경우 코드를 전혀 변경할 필요가 없습니다.

해결책은 두 부분으로 나뉩니다. 첫 번째는 jQuery ajax 처리에 연결되는 jquery 스크립트입니다. crossDomain 요청이 이루어지고 브라우저가 IE 인 경우 자동으로 웹 서버를 호출합니다.

$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
    if (!window.CorsProxyUrl) {
        window.CorsProxyUrl = '/corsproxy/';
    }
    // only proxy those requests
    // that are marked as crossDomain requests.
    if (!options.crossDomain) {
        return;
    }

    if (getIeVersion() && getIeVersion() < 10) {
        var url = options.url;
        options.beforeSend = function (request) {
            request.setRequestHeader("X-CorsProxy-Url", url);
        };
        options.url = window.CorsProxyUrl;
        options.crossDomain = false;
    }
});

웹 서버에서 요청을 수신하고 X-CorsProxy-Url http 헤더에서 값을 가져와 HTTP 요청을 수행하고 마지막으로 결과를 반환해야합니다.

내 블로그 게시물 : http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/


답변

지원되는 모든 브라우저 (IE7 + 및 일반)에 대한 유일한 솔루션이기 때문에 모든 요청을 JSONP로 작성 했습니다. 귀하의 답변은 기술적으로 IE9에서 작동하므로 올바른 답변을 얻을 수 있습니다.


답변

MoonScript의 솔루션을 기반으로하는 대신 다음을 시도해 볼 수 있습니다.

https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js

이점은 낮은 수준의 솔루션이기 때문에 jQuery뿐만 아니라 다른 프레임 워크와 함께 IE 8/9에서 CORS (가능한 범위까지)를 활성화 할 수 있다는 것입니다. AngularJS, jQuery 1.x 및 2.x와 함께 사용하는 데 성공했습니다.


답변

Internet Explorer 8 및 최신 버전에서 jQuery를 사용하여 교차 도메인 JSON 가져 오기

매우 유용한 링크 :

http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/

X 도메인 요청에서 json을 반환하는 문제를 해결할 수 있습니다.

이것이 누군가에게 도움이되기를 바랍니다.