2010-03-08 7 views
18

में document.domain का उपयोग कर समान मूल नीति वर्कअराउंड मैं जावास्क्रिप्ट में समान मूल नीति समस्याओं में चल रहा हूं। मैंने document.domain वैरिएबल का उपयोग करके इसके लिए एक समाधान के बारे में पढ़ा है, लेकिन मुझे काम करने के लिए कामकाज नहीं मिल रहा है। कामकाज यह है कि आप document.domain को 'example.com' पर सेट करने में सक्षम होना चाहिए ताकि यदि आप foo.example.com से कोड चलाते हैं तो यह bar.example.com से XHR के माध्यम से डेटा लोड कर सकता है। वैकल्पिक हल परजावास्क्रिप्ट

विवरण यहां हैं:

https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript

मेरे उदाहरण कोड - जो वांछित परिणाम का उत्पादन नहीं करता - http://foo.example.com/ की तरह किसी URL से चलाया जाता है:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
<script> 
document.domain = 'example.com'; 
window.onload = function() { 
    var req = new XMLHttpRequest(); 
    var url = 'http://bar.example.com/'; 
    req.open('GET', url, true); 
    req.onreadystatechange = function (aEvt) { 
     if (req.readyState == 4) { 
      var elem = document.getElementById('result'); 
      if (req.status == 200) { 
       var data = req.responseText; 
      } else { 
       var data = "Error loading page: " + req.status; 
      } 
      elem.innerHTML = data; 
     } 
    }; 
    req.send(null); 
}; 
</script> 
Result:<hr> 
<div id="result"></div> 
</body> 
</html> 

इस कोड से आउटपुट:

 
Result: 
Error loading page: 0 

यदि मैं url से 'http://foo.example.com/' बदलता हूं, तो सब ठीक से काम करता है। क्या मेरे उदाहरण कोड में कोई बग है?

मैं प्रॉक्सी का उपयोग नहीं करना चाहता क्योंकि वे धीमे, कम कुशल हैं, और हमारे वेब सर्वर पर यातायात में वृद्धि करेंगे। यह वास्तव में अच्छा होगा अगर यह कामकाज वास्तव में काम करता है। क्या यह कामकाज "आकाश में पाई" है?

उत्तर

3

चूंकि माइक ने जवाब दिया कि यह क्यों काम नहीं करता है, मैंने सोचा कि मैं समाधान को "कैसे" क्रॉस-डोमेन काम करने के लिए साझा करूंगा। मेरा एसओ पोस्ट here देखें।

+0

धन्यवाद j0rd4n, यह वास्तव में गैर-प्रॉक्सी समाधान का प्रकार है जिसे मैं ढूंढ रहा था, भले ही मैं दस्तावेज़.डोमेन के साथ गलत पेड़ को भड़क रहा था। मुझे जेएसओएनपी को कॉल करने वाली योजना पर थोड़ी अधिक जानकारी मिली और कैसे jQuery में यह कार्यक्षमता भी बनाई गई है, जो मेरे प्रश्न के दायरे से बाहर है, लेकिन दिलचस्प है: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/ – Rubix

+0

मैंने जिस प्रक्रिया का उल्लेख किया है वह JSONP का उपयोग करता है लेकिन यह मैन्युअल रूप से करता है। jquery JSONP के "प्राप्तकर्ता" को जावास्क्रिप्ट डॉम में संभाल लेगा, लेकिन आपको अभी भी एक सेवा प्रदान करनी होगी जो JSONP टेक्स्ट लौटाए। दिन के अंत में, आपके सर्वर पेज को स्वरूपित JSONP वापस करना होगा। आपकी जावास्क्रिप्ट (चाहे यह jquery, ext-js, आदि हो) को स्क्रिप्ट टैग के अंदर स्क्रिप्ट चलाने के लिए कॉल करना होगा। –

21

document.domain फ़्रेम/iframes के बीच संचार की अनुमति देता है। एक्सएचआर नहीं

<body> 
<iframe src="http://bar.example.com/"></iframe> 
<script> 
    document.domain = 'example.com'; 
    var ifr = document.getElementsByTagName('IFRAME')[0]; 
    ifr.onload = function(e){ 
     //will log the string "BODY" in the console 
     console.log(ifr.contentWindow.document.body.tagName); 
    }; 
</script> 
</body> 

आप document.domain के साथ लाइन निकालते हैं, तो contentWindow की सामग्री पढ़ने ही उत्पत्ति नीति की त्रुटि फेंक देते हैं।

+0

मैंने कोशिश की। क्रोम रिटर्न नेटवर्क त्रुटि में document.domain सेट करना। डेवलपर्स टूल्स ने एक ही मूल नीति समस्या को बताया। – user2284570

+1

क्या आपने 'document.domain' को मूल डोमेन और सबडोमेन दोनों में समान मान पर सेट करने का प्रयास किया था? यदि नहीं, तो यह एक त्रुटि का कारण बनता है। – Mic

+0

मुझे लगता है कि ऐसा इसलिए है क्योंकि iframe पूरी तरह से एक अलग डोमेन है। – user2284570

संबंधित मुद्दे