एक AJAX प्रतिक्रिया एक कुकी सेट कर सकती है?


266

एक AJAX प्रतिक्रिया एक कुकी सेट कर सकती है? यदि नहीं, तो मेरा वैकल्पिक उपाय क्या है? क्या मुझे इसे जावास्क्रिप्ट या कुछ इसी तरह से सेट करना चाहिए?


मैं नोड.जेएस एक्सप्रेस का उपयोग कर रहा हूं। मैंने देखा कि यदि आप ऐसा करते हैं, तो आपको सर्वर साइड पर भी जाहिरा तौर पर गलत तरीके से httpOnly फ़ील्ड सेट करना होगा।
चोंग लिप फांग

जवाबों:


247

हाँ , आप सर्वर-साइड कोड में AJAX अनुरोध में कुकी सेट कर सकते हैं जैसे आप सामान्य अनुरोध के लिए करेंगे क्योंकि सर्वर सामान्य अनुरोध या AJAX अनुरोध के बीच अंतर नहीं कर सकता है।

AJAX अनुरोध सर्वर से अनुरोध करने का एक विशेष तरीका है, सर्वर को किसी भी HTTP अनुरोध के रूप में वापस जवाब देने की आवश्यकता होगी। अनुरोध की प्रतिक्रिया में आप कुकीज़ जोड़ सकते हैं।


39
ध्यान रखें कि क्या कुकी को HTTP एजेंट द्वारा सम्मानित किया जाएगा, एक और कहानी है।
फ्रैंकी पेनोव

6
@Franci: सहमत हुए। लेकिन मुझे लगता है कि सवाल केवल http क्लाइंट्स के लिए मायने रखता है जो कुकी का समर्थन करते हैं। इसलिए सभी प्रश्नकर्ता यह जानना चाहते हैं कि क्या कुकीज़ AJAX अनुरोध में लिखी जा सकती हैं अर्थात उनका UA कुकीज़ का समर्थन करता है :)
यह। __curious_geek

10
If the user agent supports HTTP State Management it should persist, discard and send cookies (as received in the Set-Cookie response header, and sent in the Cookie header) as applicable.- w3.org/TR/XMLHttpRequest से
smwikipedia

12
यदि सर्वर सेट-कुकी हेडर के साथ सर्वर से अजाक्स अनुरोध का जवाब दे सकता है तो यह जवाब देता है। और निश्चित रूप से यह हो सकता है, लेकिन सवाल यह है कि क्या यह प्रतिक्रिया वास्तव में परिणाम देगी कि क्लाइंट ने अजाक्स प्रतिक्रिया में प्राप्त कुकी को पढ़ता है और सेट करता है, या यदि इसे मैन्युअल रूप से किया जाना है। यह उसके लिए कोई जवाब नहीं है।
एलेक्स

2
@ लेजेंड्स अजाक्स के अनुरोधों में आमतौर पर एक्स-रिक्वेस्ट-विथ हेडर होते हैं जो XMLHttpRequest पर सेट होते हैं, इस तरह से उनकी पहचान की जा सकती है, लेकिन इस हेडर के बिना एक रिक्वेस्ट की जा सकती है, यदि ऐसा होता है तो इसे सामान्य
कंप्यूटर

292

XMLHttpRequest के लिए w3 कल्पना खंड 4.6.3 के अनुसार एक उपयोगकर्ता एजेंट को सेट-कुकी हेडर का सम्मान करना चाहिए। तो इसका जवाब है हां आपको सक्षम होना चाहिए।

उद्धरण:

यदि उपयोगकर्ता एजेंट HTTP स्टेट मैनेजमेंट का समर्थन करता है, तो उसे कुकीज को छोड़ना, छोड़ना और भेजना चाहिए (जैसा कि सेट-कुकी प्रतिक्रिया हेडर में प्राप्त किया गया है, और कुकी हेडर में भेजा गया है) लागू होता है।


1
क्या IE XHR प्रतिक्रियाओं के मामले में प्रतिक्रियाओं में सेट-कुकी हेडर का समर्थन करता है?
14

जैसा कि यह एक रीडायरेक्ट पर होना चाहिए, और यह कुछ ब्राउज़रों में सम्मान नहीं करता है।
वाल्टर मैकाम्बीरा

1
मेरे लिए Chrome का उपयोग करते हुए, अजाक्स अनुरोधों में प्राप्त हेडर स्वतः क्लाइंट पर लागू हो जाएंगे।
एलेक्स

मैंने पाया कि यदि सर्वर पक्ष gzip के रूप में प्रतिक्रिया वापस सेट कर रहा है, तो कुकी सेट नहीं होती है। क्या यह कल्पना का हिस्सा है या यह केवल एक कार्यान्वयन मुद्दा है?
जुमिनोज़

89

रिकॉर्ड के लिए, सलाह दी जाती है कि उपरोक्त सभी (अभी भी) केवल तभी सही है जब AJAX कॉल उसी डोमेन पर की गई हो। यदि आप AJAX का उपयोग करके किसी अन्य डोमेन पर कुकीज़ सेट करना चाह रहे हैं, तो आप एक बिलकुल अलग प्रकार के कीड़े खोल सकते हैं । क्रॉस-डोमेन कुकीज़ पढ़ना काम करता है, हालांकि (या कम से कम सर्वर उनकी सेवा करता है; चाहे आपके ग्राहक का यूए आपके कोड को उन्हें एक्सेस करने की अनुमति देता है, फिर से, एक अलग विषय है; 2014 के अनुसार वे करते हैं)।


26
क्रॉस-डोमेन कुकीज़ भेजने के लिए, आपको withCredentials ध्वज
aeosynth

5
क्रॉस-डोमेन परिदृश्य के लिए, 3 चीज़ों का होना आवश्यक है: - (1) क्लाइंट withCredentials=trueको xhrऑब्जेक्ट के लिए सेट करने की आवश्यकता है (2) Access-Control-Allow-Credentialsविकल्प प्रीफ़्लाइट अनुरोध के साथ-साथ वास्तविक अनुरोध दोनों सेट करें (3) कुकी को आवश्यकतानुसार सेट करें
कुणाल

6

यह भी जांच लें कि आपका सर्वर एक गैर http अनुरोध पर सुरक्षित कुकीज़ सेट नहीं कर रहा है। बस पता चला कि मेरे अजाक्स अनुरोध को "सुरक्षित" सेट के साथ एक php सत्र मिल रहा था। क्योंकि मैं https पर नहीं था इसलिए यह सत्र कुकी वापस नहीं भेज रहा था और मेरा सत्र प्रत्येक ajax अनुरोध पर रीसेट हो रहा था।


क्या आप मुझे बता सकते हैं, जहाँ मैं जाँच कर सकता हूँ कि अजाक्स सुरक्षित है?
ज़ीम्पर

1
यह वास्तव में अजाक्स विशिष्ट नहीं है। यदि आप असुरक्षित http: //
फिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.