कॉर्स रिटर्न के साथ IE9 jQuery AJAX "प्रवेश निषेध है"


123

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 कोई डेटा नहीं देता है कि एक कोर अनुरोध के साथ पंगा लेना है?


चूँकि मेरे लिए किसी भी प्रस्तावित उत्तर ने काम नहीं किया (मुझे कोरस अनुरोध में कुकीज़ को पास करना पड़ा, जो कि XDomainRequest का उपयोग करते समय कोई नहीं-नहीं है), यहाँ एक काम है: blog.gauffin.org/2014/04/… । बचाव के लिए आसन्न! : p
wimvds

जवाबों:


150

यह 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 से कोर एक सामान्य XMLHttpRequest का उपयोग कर समर्थित किया जाएगा ।

एडिट 2: http से 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-limitation-and-workarounds.aspx


12
प्लगइन का "बेहतर संस्करण" जन्मजात है; मैंने अभी इसे अपने पेज में शामिल किया है और इसने मेरे $ .ajax कॉल को स्वचालित रूप से ठीक कर दिया है :) मान लें, कि आपके पास सभी आवश्यक हेडर हैं
काटो

5
डेनिसग उत्तर में जोड़ने के लिए, xdr.js में एक बग है - ajaxTransport कॉलबैक को वैसा नहीं कहा जाएगा जैसा कि है। मुझे इसे stackoverflow.com/questions/12481560/… (ajaxTransport call के पहले तर्क के रूप में "+ *" जोड़ा गया) के अनुसार बदलना पड़ा ।
वलोडिमिर ओट्रीशको

4
jQuery.XDomainRequest.js यह सुनिश्चित करता है कि वर्तमान पृष्ठ और दूरस्थ पृष्ठ http या https दोनों हैं। क्या इसका मतलब है कि आप http पृष्ठ से किसी https API के लिए कॉल नहीं कर सकते हैं?
आरोन

2
यह ध्यान देने योग्य है कि जो कोड moonscripts पर लिंक किया गया था, github repo एक पुराना संस्करण है जो काम नहीं करता है। नवीनतम संस्करण यहां प्राप्त करना सुनिश्चित करें: raw.github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/…
क्लिंटम

3
@Aaron, @ HariKaramSingh की टिप्पणी को जोड़ते हुए: प्रोटोकॉल बदलना ( httpसे https), डोमेन ( google.comसे bing.com), उप-डोमेन ( या mail.google.comसे maps.google.com), या प्रोटोकॉल ( google.com:80- डिफ़ॉल्ट पोर्ट google.com:8080) सभी एक "क्रॉस डोमेन" अनुरोध को ट्रिगर करेंगे। मूल रूप से /आपके URL में पहले से पहले सब कुछ समान होना चाहिए।
एलिकार्नर

62

@Dennisg द्वारा स्वीकृत उत्तर का निर्माण करते हुए, मैंने इसे सफलतापूर्वक MoonScript के साथ jQuery.XDomainRequest.js का उपयोग करके पूरा किया।

निम्न कोड ने क्रोम, फ़ायरफ़ॉक्स और 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]);
            }
        }
    });
};

3
JQuery.XDomainRequest.js प्लगइन वास्तव में मुझे क्या चाहिए था! मैं HTTP बेसिक प्रमाणीकरण के पीछे अनुरोधों के लिए काम करने के लिए iexhr.js प्लगइन नहीं प्राप्त कर सका, लेकिन XDomainRequest ने एक आकर्षण की तरह काम किया!
जेम्स फोर्ड

इसने मेरे लिए काम किया। मुझे Site.config () की आवश्यकता नहीं थी। एपीरूट + (जो मैं ट्विटर के लिए मान रहा हूं ....) लेकिन यह बहुत अच्छा काम करता है, यह करने के लिए धन्यवाद।
निकोलस डेकर

@NicholasDecker Site.config ()। एपीआई का रूट URL प्राप्त करने के लिए apiRoot केवल विशिष्ट कोड लागू कर रहा था, सार्वभौमिक या फैंसी कुछ भी नहीं। यह मदद की खुशी है!
जैकमोर्रसी

मुझे उम्मीद थी कि यह मेरे लिए काम करेगा, लेकिन मैं POST के लिए कोशिश कर रहा हूं। आश्चर्य है कि अगर मेरे लिए यह समस्या है।
जैक मार्शेटी

1
@ क्रेकर क्या आप केवल POST के साथ समस्याएँ हैं? JQuery के बाद स्क्रिप्ट की दोहरी जांच लोड हो रही है और आपका कॉल MoonScript के दस्तावेज़ से मेल खाता है।
जैकमोरसी

16

"JQuery-ajaxTransport-XDomainRequest" प्लगइन का उपयोग करके इसे कैसे करें, इस पर पूर्ण निर्देश यहां देखे जा सकते हैं: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

यह प्लगइन सक्रिय रूप से समर्थित है, और HTML, JSON और XML को संभालता है। फ़ाइल को CDNJS पर भी होस्ट किया गया है, इसलिए आप बिना किसी अतिरिक्त सेटअप के सीधे स्क्रिप्ट को अपने पृष्ठ में छोड़ सकते हैं: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainquest/1.0.1/jquery.xdomainrequest .min.js


1
यह बहुत अच्छा काम किया - ठीक में ड्रॉप। अविश्वसनीय है कि यह मुद्दा jQuery में मौजूद है, लेकिन ... धन्यवाद!
कायमी

3

समस्या यह है कि IE9 और नीचे कोर का समर्थन नहीं करते हैं। XDomainRequest केवल GET / POST और कॉन text/plain-टाइप का समर्थन करते हैं जैसा कि यहाँ वर्णित है: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitation-and-workarounds.aspx

इसलिए यदि आप सभी HTTP क्रियाओं और / या json आदि का उपयोग करना चाहते हैं, तो आपको दूसरे समाधान का उपयोग करना होगा। मैंने एक प्रॉक्सी लिखी है जो आईई 9 या उससे कम इस्तेमाल होने पर गर्व से डाउनग्रेड कर देगी। यदि आप ASP.NET का उपयोग कर रहे हैं तो आपको अपना कोड बिल्कुल भी बदलने की आवश्यकता नहीं है।

समाधान दो भागों में है। पहला एक jquery स्क्रिप्ट है जो jQuery के अजाक्स प्रसंस्करण में हुक करता है। यदि क्रॉसडोमेन अनुरोध किया जाता है और ब्राउज़र 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/


1

मैंने सिर्फ JSONP के सभी अनुरोध किए क्योंकि यह हमारे सभी समर्थित ब्राउज़रों (IE7 + और नियमित) के लिए एकमात्र समाधान था। ध्यान रहे, आपका उत्तर तकनीकी रूप से IE9 के लिए काम करता है, इसलिए आपके पास सही उत्तर है।


2
इस समस्या वाले किसी को भी ध्यान दें-- इस मामले में, यदि आपके पास एक <= IE7 आवश्यकता है, और आपके पास सर्वर पर नियंत्रण नहीं है (जैसे कि यह GET + स्क्रिप्ट टैग w / JSONP का समर्थन नहीं कर सकता है) बेस्ट बेट लाइटवेट मिडलवेयर सर्वर है जो JSONP कॉल को POST में तब्दील करता है और ब्लैक बॉक्स सर्वर से यूजर को मिलने वाले रिस्पॉन्स को स्ट्रीम करता है।
मिकरमेन्सिल

1

MoonScript द्वारा समाधान पर निर्माण, आप इसके बजाय यह कोशिश कर सकते हैं:

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

लाभ यह है कि चूंकि यह निचले स्तर का समाधान है, इसलिए यह आईई 8/9 पर कॉर्स (हद तक संभव) अन्य चौखटे के साथ सक्षम करेगा, न कि केवल jQuery के साथ। मुझे इसे AngularJS, साथ ही jQuery 1.x और 2.x के साथ प्रयोग करने में सफलता मिली है।


0

Internet Explorer 8 और नए संस्करणों में jQuery के साथ एक क्रॉस-डोमेन JSON प्राप्त करना

बहुत उपयोगी लिंक:

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

एक्स डोमेन रिक्वेस्ट से जौन लौटने की परेशानी में मदद कर सकता है।

आशा है कि यह किसी की मदद करता है।


0

इस समस्या को हल करने के लिए, यह भी जांच लें कि क्या आपने कुछ .js को अपने ajax फ़ाइल में शामिल किया है: मुझे मेरे ajax.php में shabox.js सहित पहुँच अस्वीकृत त्रुटि मिली है।


0

मैं अपने देव मशीन पर एक CORS वेब सेवा का परीक्षण कर रहा था और केवल IE में "प्रवेश निषेध है" त्रुटि संदेश प्राप्त कर रहा था। फ़ायरफ़ॉक्स और क्रोम ने ठीक काम किया। यह पता चला है कि यह अजाक्स कॉल में लोकलहोस्ट के मेरे उपयोग के कारण हुआ था! तो मेरा ब्राउज़र URL कुछ इस तरह था:

http: //my_computer.my_domain.local/CORS_Service/test.html

और test.html के अंदर मेरा अजाक्स कॉल कुछ इस तरह था:

//fails in IE 
$.ajax({
  url: "http://localhost/CORS_Service/api/Controller",
  ...
});

सब कुछ काम करने के बाद जब मैंने स्थानीय कंप्यूटर के बजाय अपने कंप्यूटर आईपी का उपयोग करने के लिए ajax कॉल को बदल दिया।

//Works in IE
$.ajax({
  url: "http://192.168.0.1/CORS_Service/api/Controller",
  ...
});

IE देव उपकरण विंडो "नेटवर्क" टैब भी XMLSttpRequest GET द्वारा पीछा कोर प्रीफ्लाइट विकल्प अनुरोध को दर्शाता है, जो कि वास्तव में मुझे देखने की उम्मीद थी।


0

जल्दी 2015 तक अपडेट करें। xDomain सीमित अतिरिक्त कोडिंग के साथ IE9 पर CORS का समर्थन करने के लिए एक व्यापक रूप से उपयोग की जाने वाली लाइब्रेरी है।

https://github.com/jpillora/xdomain



-1

नोट - नोट

URL में ajax के लिए " http://www.domain.xxx " या " http: // localhost / " या "IP >> 127.0.0.1" का उपयोग न करें । बिना पते के केवल पथ (निर्देशिका) और पृष्ठ नाम का उपयोग करें।

झूठी अवस्था:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true);
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);

सही स्थिति:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'dir/getSecurityCode.php', true);   // <<--- note
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.