इस तरह से:
किसी दिए गए सुपरडोमेन (जैसे example.com) के उप-डोमेन के बीच साझा करने के लिए, एक ऐसी तकनीक है जिसका उपयोग आप उस स्थिति में कर सकते हैं। यह करने के लिए लागू किया जा सकता localStorage
, IndexedDB
, SharedWorker
, BroadcastChannel
, आदि, जो सभी एक ही मूल के पन्नों के बीच साझा कार्यक्षमता प्रदान करते हैं, लेकिन किसी कारण से करने के लिए किसी भी संशोधन का सम्मान नहीं करते document.domain
कि उन्हें सीधे अपने मूल रूप में superdomain का उपयोग करते हैं जाएगा।
(1) डेटा के लिए एक "मुख्य" डोमेन चुनें: यानी या तो https://example.com या https://www.example.com आपके लोकलस्टोरेज डेटा को रखेगा। आइए आपको बताते हैं https://example.com ।
(2) उस चुने हुए डोमेन के पन्नों के लिए सामान्य रूप से लोकलस्टोरेज का उपयोग करें।
(3) सभी https://www.example.com पृष्ठों ( अन्य डोमेन) पर, जावास्क्रिप्ट को सेट करने के लिए उपयोग करें document.domain = "example.com";
। फिर एक छिपा हुआ भी बनाएं <iframe>
, और इसे चुने हुए https://example.com डोमेन के किसी पृष्ठ पर नेविगेट करें ( यह कोई फर्क नहीं पड़ता कि कौन सा पृष्ठ है , जब तक आप वहां पर जावास्क्रिप्ट का बहुत कम स्निपेट डाल सकते हैं। यदि आप ' साइट बनाने के लिए, बस इस उद्देश्य के लिए विशेष रूप से एक खाली पृष्ठ बनाएं। यदि आप एक एक्सटेंशन या एक Greasemonkey- शैली उपयोगकर्ता नाम लिख रहे हैं और उदाहरण के लिए पृष्ठों पर कोई नियंत्रण नहीं है।सर्वर, सबसे हल्का पृष्ठ चुनें जिसे आप पा सकते हैं और उसमें अपनी स्क्रिप्ट डाल सकते हैं। किसी प्रकार का "नहीं मिला" पृष्ठ शायद ठीक होगा)।
(4) छिपे हुए iframe पेज पर स्क्रिप्ट को केवल (ए) सेट की आवश्यकता होती है document.domain = "example.com";
, और (बी) ऐसा होने पर मूल विंडो को सूचित करें। उसके बाद, पेरेंट विंडो iframe विंडो और उसके सभी ऑब्जेक्ट्स को बिना किसी प्रतिबंध के एक्सेस कर सकती है! तो न्यूनतम iframe पेज कुछ इस तरह है:
<!doctype html>
<html>
<head>
<script>
document.domain = "example.com";
window.parent.iframeReady(); // function defined & called on parent window
</script>
</head>
<body></body>
</html>
यदि कोई उपयोगकर्ता-पत्र लिख रहा है, तो आप बाह्य-सुलभ कार्यों iframeReady()
को अपने साथ जोड़ना नहीं चाह सकते हैं unsafeWindow
, इसलिए मुख्य विंडो उपयोगकर्ता-सूचना को सूचित करने का एक बेहतर तरीका एक कस्टम घटना का उपयोग करना हो सकता है:
window.parent.dispatchEvent(new CustomEvent("iframeReady"));
जिसे आप अपने मुख्य पृष्ठ की विंडो में कस्टम "iframeReady" ईवेंट के लिए श्रोता जोड़कर पता लगाएंगे।
(नोट: आपको iframe का डोमेन पहले से example.com है, तब भी आपको document.domain = "example.com" सेट करने की आवश्यकता है: document.domain के लिए मान निर्दिष्ट करना मूल रूप से मूल पोर्ट को शून्य करने के लिए सेट करता है , और दोनों पोर्ट iframe के लिए मेल खाना चाहिए और इसके मूल को समान माना जाता है। यहां देखें नोट: https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Changing_origin )
(5) एक बार छिपा iframe अपनी मूल विंडो इसके तैयार होते ही सूचित किया है, माता पिता के विंडो में स्क्रिप्ट अभी उपयोग कर सकते हैं iframe.contentWindow.localStorage
, iframe.contentWindow.indexedDB
, iframe.contentWindow.BroadcastChannel
, iframe.contentWindow.SharedWorker
बजाय window.localStorage
, window.indexedDB
आदि ... और इन सभी वस्तुओं के दायरे वाला हो जाएगा चुना https: // example.com मूल - तो वे आपके सभी पृष्ठों के लिए समान साझा मूल होंगे!
इस तकनीक का सबसे अजीब हिस्सा यह है कि आपको आगे बढ़ने से पहले आईफ्रेम को लोड करने के लिए इंतजार करना होगा। इसलिए आप उदाहरण के लिए, अपने DOMContentLoaded हैंडलर में स्थानीय रूप से उपयोग करना शुरू नहीं कर सकते। यह भी पता लगाने के लिए आप कुछ त्रुटि हैंडलिंग जोड़ना चाह सकते हैं कि क्या छिपा हुआ iframe सही तरीके से लोड करने में विफल रहता है।
जाहिर है, आपको यह भी सुनिश्चित करना चाहिए कि आपके पेज के जीवनकाल के दौरान छिपे हुए आइफ्रेम को हटाया या नेविगेट नहीं किया गया है ... ओटोह मुझे नहीं पता कि इसका परिणाम क्या होगा, लेकिन बहुत संभावना है कि खराब चीजें होंगी।
और, एक चेतावनी: सेटिंग / बदलना हेडर का उपयोग करके अवरुद्धdocument.domain
किया जा सकता है , जिस स्थिति में यह तकनीक वर्णित के रूप में उपयोग करने योग्य नहीं होगी।Feature-Policy
हालाँकि, इस तकनीक का एक बहुत अधिक जटिल सामान्यीकरण है, जिसे अवरुद्ध नहीं किया जा सकता है Feature-Policy
, और यह पूरी तरह से असंबंधित डोमेन को डेटा, संचार, और साझा किए गए श्रमिकों को साझा करने की अनुमति देता है (अर्थात एक सामान्य सुपरडोमेन बंद नहीं करता है)। @ मयंक जैन ने पहले ही अपने उत्तर में इसका वर्णन कर दिया, अर्थात्:
सामान्य विचार यह है कि, ऊपर के रूप में, आप पहुंच के लिए सही मूल प्रदान करने के लिए एक छिपा हुआ आइफ्रेम बनाते हैं; लेकिन इसके बजाय बस सीधे iframe विंडो के गुणों को हथियाने के लिए, आप सभी काम करने के लिए iframe के अंदर स्क्रिप्ट का उपयोग करते हैं, और आप iframe और आपके मुख्य विंडो के बीच केवल उपयोग करने postMessage()
और के बीच संवाद करते हैं addEventListener("message",...)
।
यह काम करता है क्योंकि postMessage()
विभिन्न-मूल खिड़कियों के बीच भी इस्तेमाल किया जा सकता है। लेकिन यह काफी अधिक जटिल है क्योंकि आपको कुछ प्रकार के मैसेजिंग इन्फ्रास्ट्रक्चर के माध्यम से सब कुछ पास करना पड़ता है जो कि आप अपने मुख्य विंडो के कोड में सीधे लोकलस्टोरेज, इंडेक्सडीडीबी, आदि एपीआई का उपयोग करने के बजाय, आइफ्रेम और मुख्य विंडो के बीच बनाते हैं।