मेरे साथ भालू, इसे किसी स्पष्टीकरण की आवश्यकता है।मोबाइल वेबव्यू से कॉर्स कुकी क्रेडेंशियल्स स्थानीय रूप से फ़ाइल के साथ लोड किया गया: //
मैं एक हाइब्रिड मोबाइल वेब ऐप बनाने में मदद कर रहा हूं। मुख्य कोडबेस एचटीएमएल 5 और जावास्क्रिप्ट है, जो मूल मोबाइल वेब व्यू (एक ला फोनगैप) में लपेटा जाएगा।
कार्यक्षमता का एक हिस्सा ऐप को हमारे ग्राहकों में से किसी एक द्वारा नियंत्रित वेब सेवा पर जानकारी पोस्ट करने की आवश्यकता है। इस वेब सेवा को बदलने के लिए बहुत कम गुंजाइश है क्योंकि इसका इस्तेमाल दूसरों द्वारा किया जा रहा है। हम एक HTTP पोस्ट का उपयोग कर JSON भेजते हैं और सर्वर से प्रतिक्रिया प्राप्त करते हैं। इस प्रतिक्रिया का हिस्सा एक JSESSIONID कुकी है जो सर्वर के साथ हमारे सत्र का प्रबंधन करता है। प्रारंभिक initSession()
कॉल के बाद, हमें JSESSIONID कुकी को प्रत्येक (AJAX) अनुरोध के साथ भेजने की आवश्यकता है।
मोबाइल डिवाइस पर तैनात किए जाने पर, वेब ऐप देशी वेब व्यू में लपेटा जाता है, जो file:///path/to/app/index.html
पर ब्राउज़ करके वेब ऐप शुरू करता है।
पहली बात हमने कोशिश की थी कि हमारे ग्राहक को सीआरओएस को अनुमति देने के लिए उनके प्रतिक्रिया शीर्षलेख में Access-Control-Allow-Origin: *
सेट करने के लिए कहा जा रहा था। इसके बाद हमने सर्वर पर पोस्ट करने का प्रयास किया:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback
});
अनुरोधों की निगरानी, यह स्पष्ट था कि कुकीज़ शामिल नहीं की जा रही थीं। करीब निरीक्षण पर special section in the CORS spec for dealing with user credentials है, जिसमें सत्र कुकीज़ शामिल है। इसलिए मैंने इसे शामिल करने के लिए AJAX कॉल को संशोधित किया:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback,
xhrFields { withCredentials: true }
});
ब्राउज़र से इस बार एक और त्रुटि। अधिक पढ़ने से निम्नलिखित उत्पन्न हुए:
यदि तृतीय पक्ष सर्वर ने
Access-Control-Allow-Credentials: true
शीर्षलेख के साथ प्रतिक्रिया नहीं दी है तो प्रतिक्रिया को अनदेखा कर दिया जाएगा और वेब सामग्री पर उपलब्ध नहीं किया जाएगा।महत्वपूर्ण नोट: एक प्रमाणित अनुरोध का जवाब देते समय, सर्वर को
Access-Control-Allow-Origin
शीर्षलेख में एक डोमेन निर्दिष्ट करना होगा, और जंगली कार्डिंग का उपयोग नहीं कर सकता है।
तो हम सर्वर के हेडर को बदलने के लिए Access-Control-Allow-Credentials: true
और Access-Control-Allow-Origin
हमारे उत्पत्ति को शामिल करना होगा।
यहां हम अंततः मेरी समस्या पर आते हैं: when loading a web page using the file:// protocol, Origin
वेब व्यू से भेजे गए अनुरोध हेडर को null
पर सेट किया गया है। इसलिए इसे सर्वर द्वारा पार्स नहीं किया जा सकता है और इसलिए सर्वर इसे Access-Control-Allow-Origin
में सेट नहीं कर सकता है। लेकिन अगर सर्वर Access-Control-Allow-Origin
*
के अलावा किसी अन्य चीज़ पर सेट नहीं कर सकता है, तो हम कुकीज सहित प्रमाण-पत्र नहीं भेज सकते हैं।
तो मैं अटक गया हूं। क्या करें? I saw a similar question posted here लेकिन मैं वास्तव में प्रस्तावित उत्तर को समझ नहीं पा रहा हूं। कोई भी सहायताकाफी प्रशंसनीय होगी!
एकमात्र समाधान मैं के बारे में सोच सकते हैं वेब सेवा हिट करने के लिए एक सर्वर का उपयोग किया जाएगा के बिना उन अनुरोधों फ़िल्टर किया जाना चाहिए था। आप एक HTTP हैंडलर लिख सकते हैं और इसे अपने मोबाइल ऐप से हिट कर सकते हैं। स्पष्ट रूप से यह सर्वर रखरखाव में अतिरिक्त ओवरहेड जोड़ता है लेकिन आपके पास कुछ उपलब्ध होना चाहिए, नहीं? –
हां, यह अंतरिम समाधान है, एक बुरा PHP कर्ल इंटरमीडिएट गेटवे। यह वास्तव में आदर्श नहीं है, लेकिन कम से कम समय के लिए काम करता है। – fiznool
एक चीज जो मैं कर सकता हूं वह फोनगैप देवताओं से पूछता है अगर उन्होंने पहले ऐसा कुछ देखा है और कोई कामकाज है ... – fiznool