আইও 9 jQuery AJAX সিওআরএস দিয়ে "অ্যাক্সেস প্রত্যাখ্যান করা হয়েছে"


123

নীচে 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'তবে এজেএক্স কলটিতে আমার কোনও ডেটা ফেরার দরকার নেই। আমার শেষ অবলম্বনটি কেবল এটি কার্যকর করার জন্য জেএসওএনপিতে মোড়ানো কিছু জিব্বারিশ ফিরিয়ে দেওয়া হবে।

কোনও ধারণা কেন আইই কোনও সিওআরএস অনুরোধে খোঁজ নিচ্ছে যা কোনও তথ্য ফেরত দেয় না?


যেহেতু প্রস্তাবিত উত্তরগুলির কোনওটিই আমার পক্ষে কাজ করেনি (XComaineRequest ব্যবহার করার সময় আমাকে সিওআরএস অনুরোধেও কুকিজ পাস করতে হয়েছিল), তাই এখানে প্রায় কাজ করা হয়েছে: blog.gauffin.org/2014/04/… । উদ্ধার প্রত্যাশা! : পি
wimvds

উত্তর:


150

এটি jQuery সহ একটি পরিচিত বাগ । JQuery টিমের "এটিকে মূলত সমর্থন করার কোনও পরিকল্পনা নেই এবং প্লাগইন হিসাবে এটি আরও উপযুক্ত।" ( এই মন্তব্য দেখুন )। IE এক্সএমএলএইচটিপিআরকোয়েস্ট ব্যবহার করে না , তবে XDomainRequest নামে একটি বিকল্প অবজেক্ট ।

সেখানে হয় একটি প্লাগইন jQuery মধ্যে এই সমর্থন করার জন্য পাওয়া যায়, যা এখানে পাওয়া যাবে : https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

সম্পাদনা ফাংশনটি $.ajaxTransportএকটি ট্রান্সপোর্টার কারখানা নিবন্ধন করে। অনুরোধ সম্পাদনের জন্য অভ্যন্তরীণভাবে একটি ট্রান্সপোর্টার ব্যবহার করা $.ajaxহয়। অতএব, আমি ধরে নিলাম আপনার $.ajaxযথারীতি কল করা উচিত । পরিবহনকারী এবং সম্প্রসারণ সম্পর্কিত তথ্য এখানে$.ajax পাওয়া যাবে

এছাড়াও, এই প্লাগইনটির একটি সম্ভবত আরও ভাল সংস্করণ পাওয়া যাবে

অন্য দুটি নোট:

  1. এক্সডোমেনআরওয়েস্ট আইটেমটি আইই 8 থেকে প্রবর্তিত হয়েছিল এবং নীচের সংস্করণগুলিতে কাজ করবে না।
  2. আইই 10 থেকে CORS একটি সাধারণ এক্সএমএলএইচটিপিআরকোয়েস্ট ব্যবহার করে সমর্থিত হবে ।

সম্পাদনা 2: https সমস্যাটিতে HTTP

অনুরোধগুলি হোস্টিং পৃষ্ঠার মতো একই স্কিমের দিকে লক্ষ্য রাখতে হবে

এই বিধিনিষেধের অর্থ হ'ল যদি আপনার AJAX পৃষ্ঠাটি http://example.com এ থাকে তবে আপনার টার্গেট URL টিও এইচটিটিপি দিয়ে শুরু করতে হবে। একইভাবে, যদি আপনার এজেএক্স পৃষ্ঠাটি https://example.com এ থাকে তবে আপনার টার্গেট ইউআরএলটিও এইচটিটিপিএস দিয়ে শুরু করতে হবে।

সূত্র: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx


12
প্লাগইনের "উন্নত সংস্করণ" সহজাত; আমি কেবল এটি আমার পৃষ্ঠায় অন্তর্ভুক্ত করেছি এবং এটি স্বয়ংক্রিয়ভাবে আমার aj .জ্যাক্স কলগুলিকে স্থির করেছে :) ধরে নিই, আপনার জায়গায় প্রয়োজনীয় সমস্ত শিরোনাম রয়েছে।
কাটো

5
ড্যানিসগ উত্তরে যুক্ত করতে, xdr.js এর একটি বাগ রয়েছে - এজ্যাক্সট্রান্সপোর্ট কলব্যাক যেমন কল করা হবে না। আমি অনুযায়ী সেটা বদলাতে হবে stackoverflow.com/questions/12481560/... (যোগ, "+ *" ajaxTransport কলের একটি প্রথম আর্গুমেন্ট হিসাবে)।
ভোলাডাইমির ওত্রেশকো

4
jQuery.XDomainRequest.js নিশ্চিত করে যে বর্তমান পৃষ্ঠা এবং দূরবর্তী পৃষ্ঠাটি উভয়ই HTTP বা https। এর অর্থ কি এই যে আপনি কোনও HTTP পৃষ্ঠা থেকে কোনও https এপিআইতে কল করতে পারবেন না?
হারুন

2
এটি লক্ষণীয় যে মুনস্ক্রিপ্টগুলিতে গিথুব রেপোতে লিঙ্কযুক্ত কোডটি একটি পুরানো সংস্করণ যা কাজ করে না। সর্বশেষ সংস্করণটি পেতে নিশ্চিত হন: Raw.github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/…
ক্লিন্টম

3
অ্যারন, @ হরিকারমসিংহের মন্তব্যে যোগ করেছেন: প্রোটোকল ( httpটু https), ডোমেনস ( google.comটু bing.com), সাবডোমেনস ( mail.google.comটু maps.google.com), বা প্রোটোকল ( google.com:80- ডিফল্ট পোর্টে google.com:8080) সমস্ত একটি "ক্রস ডোমেন" অনুরোধকে ট্রিগার করবে। মূলত /আপনার ইউআরএল এর প্রথমটির আগে সমস্ত কিছু অভিন্ন হওয়া দরকার।
allicarn

62

@ এডনিসগ দ্বারা গৃহীত উত্তরটি বন্ধ করে, আমি মুনস্ক্রিপ্ট দ্বারা jQuery.XDomainRequest.js ব্যবহার করে এটি সফলভাবে সম্পন্ন করেছি।

নিম্নলিখিত কোডটি ক্রোম, ফায়ারফক্স এবং আই 10 তে সঠিকভাবে কাজ করেছে, কিন্তু আইই 9 এ ব্যর্থ হয়েছে। আমি কেবল স্ক্রিপ্টটি অন্তর্ভুক্ত করেছি এবং এটি এখন স্বয়ংক্রিয়ভাবে আই 9-এ কাজ করে। (এবং সম্ভবত 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 প্লাগইনটি আমার প্রয়োজন মতো ছিল! এইচটিটিপি বেসিক প্রমাণীকরণের পিছনে অনুরোধগুলির জন্য কাজ করতে আমি iexhr.js প্লাগইনটি পেতে পারি না, তবে এক্সডোমেনআরয়েয়েস্ট মনোযোগের মতো কাজ করেছিল!
জেমস ফোর্ড

এটি আমার পক্ষে কাজ করেছে। আমার সাইটকনফিগের দরকার নেই ()। এপিআরট + (যা আমি ধরে নিচ্ছি টুইটারের জন্য ....) তবে এটি দুর্দান্ত কাজ করেছে, এটি করার জন্য ধন্যবাদ thanks
নিকোলাস ডেকার

@ নিকোলাসডেকার সাইট.কনফিগ ()। এপিআই রুট কেবলমাত্র API এর মূল ইউআরএল পাওয়ার জন্য নির্দিষ্ট কোডটি বাস্তবায়ন করছিল, সর্বজনীন বা অভিনব কিছুই নয়। খুশি এটা সাহায্য!
জ্যাকমোরিসি

আমি আশা করছিলাম এটি আমার পক্ষে কাজ করবে তবে আমি পোস্ট করার চেষ্টা করছি। যদি আমার জন্য সমস্যা হয় তবে অবাক হন।
জ্যাক মার্কেটি

1
@ ক্র্যাকার আপনার কি কেবল পোস্টে সমস্যা রয়েছে? JQuery এর পরে স্ক্রিপ্টটি লোড হচ্ছে এবং আপনার কল মুনস্ক্রিপ্টের ডকুমেন্টেশনের সাথে মেলে।
জ্যাকমোরিসি

16

"JQuery-ajaxTransport-XDomainRequest" প্লাগইন ব্যবহার করে এটি কীভাবে করবেন তার সম্পূর্ণ নির্দেশাবলী এখানে পাওয়া যাবে: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

এই প্লাগইনটি সক্রিয়ভাবে সমর্থিত এবং এইচটিএমএল, জেএসএন এবং এক্সএমএল পরিচালনা করে। ফাইল এছাড়াও CDNJS হোস্ট করা হয়, তাই আপনি সরাসরি কোন অতিরিক্ত সেটআপ সঙ্গে আপনার পৃষ্ঠাতে স্ক্রিপ্ট ড্রপ করতে পারেন: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest .min.js


1
এটি দুর্দান্ত কাজ করেছে - ড্রপ ফিক্স। অবিশ্বাস্য যে এই সমস্যাটি jQuery এ বিদ্যমান তবে ... ধন্যবাদ!
সাইমন

3

সমস্যাটি হ'ল আই 9 এবং নীচে সিওআরএস সমর্থন করে না। XDomainRequest কেবল text/plainএখানে বর্ণিত GET / POST এবং কনটেন্ট-টাইপ সমর্থন করে : http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations- এবং- workarounds.aspx

সুতরাং আপনি যদি সমস্ত এইচটিটিপি ক্রিয়া এবং / অথবা জেসন ইত্যাদি ব্যবহার করতে চান তবে আপনাকে অন্য একটি সমাধান ব্যবহার করতে হবে। আমি একটি প্রক্সি লিখেছি যা আই 9 বা তার বেশি ব্যবহার করা থাকলে প্রক্সিংয়ে মনোযোগ দিয়ে ডাউনগ্রেড হবে। আপনি যদি এএসপি.এনইটি ব্যবহার করে থাকেন তবে আপনাকে আপনার কোডটি কোনও পরিবর্তন করতে হবে না।

সমাধান দুটি অংশে হয়। প্রথমটি একটি 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;
    }
});

আপনার ওয়েব সার্ভারে আপনাকে অনুরোধটি গ্রহণ করতে হবে, এক্স-কর্স প্রক্সি-ইউরাল HTTP শিরোনামের কাছ থেকে মানটি পেতে এবং একটি HTTP অনুরোধ করুন এবং শেষ পর্যন্ত ফলাফলটি ফিরিয়ে আনতে হবে।

আমার ব্লগ পোস্ট: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/


1

আমি কেবল সমস্ত অনুরোধ জেএসওএনপি করেছি কারণ এটি আমাদের সমর্থিত সমস্ত ব্রাউজারের (আই 7 + এবং নিয়মিত) একমাত্র সমাধান ছিল। মনে মনে, আপনার উত্তর প্রযুক্তিগতভাবে আই 9 এর জন্য কাজ করে যাতে আপনার সঠিক উত্তর থাকে।


2
এই সমস্যায় যে কারও কাছে কেবল একটি নোট - এই ক্ষেত্রে, আপনার যদি একটি <= আই 7 প্রয়োজনীয়তা থাকে এবং আপনার সার্ভারের নিয়ন্ত্রণ না থাকে (যেমন এটি জিইটি + স্ক্রিপ্ট ট্যাগগুলি ডাব্লু / জেএসএনপি সমর্থন করতে পারে না) আপনার সেরা বেট হ'ল লাইটওয়েট মিডলওয়্যার সার্ভার যা কোনও পোস্টে জেএসএনপি কল অনুবাদ করে এবং ব্ল্যাক বক্স সার্ভার থেকে ব্যবহারকারীকে প্রতিক্রিয়া প্রবাহিত করে।
মিকর্ম্কনিল

1

মুনস্ক্রিপ্ট দ্বারা সমাধান তৈরি করে, আপনি পরিবর্তে এটি চেষ্টা করতে পারেন:

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

সুবিধাটি হ'ল যেহেতু এটি একটি নিম্ন স্তরের সমাধান, এটি কেবল jQuery দ্বারা নয়, অন্যান্য ফ্রেমওয়ার্কগুলির সাথে IE 8/9 এ CORS (সম্ভব সীমা পর্যন্ত) সক্ষম করবে। আমি এঙ্গুলারজেএস, পাশাপাশি জিকুয়ারি ১.x এবং ২.x ব্যবহার করে সাফল্য পেয়েছি


0

ইন্টারনেট এক্সপ্লোরার 8 এবং আরও নতুন সংস্করণে jQuery সহ একটি ক্রস-ডোমেন জেএসএন পাচ্ছেন

খুব দরকারী লিঙ্ক:

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

এক্স ডোমেন রিকুয়েস্ট থেকে জেসন ফিরিয়ে দেওয়ার সমস্যায় সহায়তা করতে পারে।

আশা করি এটি কারও সাহায্য করবে।


0

এই সমস্যাটি সমাধান করার জন্য, আপনার অজ্যাক্স নামক ফাইলটিতে কিছু .js অন্তর্ভুক্ত রয়েছে কিনা তাও পরীক্ষা করে দেখুন: আমার অজ্যাক্স.এফপি-র শ্যাডবক্স.জেজ সহ আমি অ্যাক্সেস অস্বীকার করা ত্রুটি পেয়েছি I


0

আমি আমার ডেভ মেশিনে একটি সিওআরএস ওয়েব পরিষেবা পরীক্ষা করছিলাম এবং কেবল আইই-তে "অ্যাক্সেস অস্বীকার করা হয়েছে" ত্রুটি বার্তা পাচ্ছিলাম। ফায়ারফক্স এবং ক্রোম ভাল কাজ করেছে। দেখা যাচ্ছে এটি আমার লোকালহোস্টটি এজ্যাক্স কলটিতে ব্যবহারের কারণে ঘটেছে! সুতরাং আমার ব্রাউজার ইউআরএল কিছু ছিল:

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

এবং টেস্টের ভিতরে আমার এজাক্স কলটি ছিল html:

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

লোকালহোস্টের পরিবর্তে আমার কম্পিউটারের আইপি ব্যবহারের জন্য অজ্যাক্স কলটি একবার পরিবর্তন করে সমস্ত কিছু কার্যকর হয়েছিল।

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

আই ডি ডি টুলস উইন্ডো "নেটওয়ার্ক" ট্যাবটি এক্সএমএলএইচটিপিআরকোয়েস্ট জিইটি-র অনুসরণের পরে সিওআরএস প্রিফলাইট অপশনগুলি প্রদর্শন করে যা আমি দেখতে প্রত্যাশা করেছিলাম।




-1

দ্রষ্টব্য - নোট

" http://www.domain.xxx " বা " http: // লোকালহোস্ট / " ব্যবহার করবেন নাএজ্যাক্সে ইউআরএল-এর জন্য " বা "আইপি >> 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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.