अजाक्स अनुरोध में पुनर्निर्देशन का पता लगाना?


94

मैं एक URL प्राप्त करने के लिए jQuery का उपयोग करना चाहता हूं और अगर यह 302 रीडायरेक्ट के साथ प्रतिक्रिया करता है, तो स्पष्ट रूप से जांच करें, लेकिन रीडायरेक्ट का पालन करें।

jQuery के $.ajaxहमेशा अनुप्रेषित का पालन करने के लिए प्रकट होता है। मैं इसे कैसे रोक सकता हूं, और इसका पालन किए बिना पुनर्निर्देशित देख सकता हूं?

"Jquery ajax redirect" जैसे शीर्षकों के साथ विभिन्न प्रश्न हैं, लेकिन वे सभी किसी अन्य लक्ष्य को पूरा करने में शामिल होते हैं, न कि सीधे उस स्थिति की सीधे जाँच करते हैं जो एक सर्वर देता है।

जवाबों:


87

AJAX अनुरोध में पुनर्निर्देशन का पालन नहीं करने का अवसर कभी नहीं है (यानी, इसे पुनर्निर्देशित का पालन करना चाहिए)। अधिक जानकारी इस उत्तर https://stackoverflow.com/a/2573589/965648 पर देखी जा सकती है


41

आने वाला कल आपका स्वागत करता है!

अभी हमारे पास xhr ऑब्जेक्ट से एक "responseURL" संपत्ति है। वाह!

देखें कि XMLHttpRequest में प्रतिक्रिया url कैसे प्राप्त करें?

हालाँकि, jQuery (कम से कम 1.7.1) सीधे XMLHttpRequest ऑब्जेक्ट तक पहुँच नहीं देता है। आप इस तरह से कुछ का उपयोग कर सकते हैं:

var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
  xhr = _orgAjax();
  return xhr;
};

jQuery.ajax('http://test.com', {
  success: function(responseText) {
    console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
  }
});

यह एक साफ समाधान नहीं है और मुझे लगता है कि jQuery की टीम भविष्य के रिलीज में प्रतिक्रिया के लिए कुछ करेगी।

TIP : बस प्रतिसाद के साथ मूल URL की तुलना करें। यदि यह समान है तो कोई पुनर्निर्देशन नहीं दिया गया था। यदि यह "अपरिभाषित" है, तो responseUrl शायद समर्थित नहीं है। हालांकि, जैसा कि निक गेरेव ने कहा, AJAX के अनुरोध में कभी भी अनुप्रेषण का पालन नहीं करने का अवसर होता है, लेकिन आप प्रतिक्रियाशील संपत्ति का उपयोग करके कई कार्यों को हल कर सकते हैं।


1
इस विशेषता पर कुछ और संसाधन जोड़ने के लिए - XHR.responseURL पर MDN पृष्ठ - सामान्य समर्थन MSIE पर प्रतीक्षा कर रहा है, जिसने केवल इसे एज / 14 में जोड़ा।
एली कॉलिन्स

धन्यवाद ! बहुत उपयोगी
Gautier

मैंने पाया कि यह कोड वास्तव में $ .ajax ({url: 'someurl', xhrFields: {withCredentials: true}}) बनाता है, क्योंकि Internet Explorer में कोई त्रुटि है, क्योंकि _orgAjax फ़ंक्शन $'ajaxSettings '' चर पर निर्भर करता है। वस्तु। जब ऐसा नहीं होता है, तो jQuery XMLHttpRequest ऑब्जेक्ट के बजाय एक ActiveX IXMLHTTPRequest ऑब्जेक्ट बनाता है, जो withCredentials प्रॉपर्टी का समर्थन नहीं करता है। मैंने xhr = _orgAjax.call ($। AjaxSettings) को कॉल करके इसे ठीक किया; xhr = _orgAjax () के बजाय; मुझे उम्मीद है इससे किसी को सहायता मिलेगी।
स्टीफनके सीपी

11

हालांकि इस सवाल का जवाब देने वाले अन्य लोग (दुख की बात) यह सही है कि यह जानकारी ब्राउज़र द्वारा हमसे छिपाई गई है, मैंने सोचा कि मैं एक वर्कअराउंड पोस्ट करूंगा, जिसके साथ मैं आया था:

मैंने अपने सर्वर ऐप को कस्टम रिस्पांस हेडर ( X-Response-Url) युक्त URL सेट करने के लिए कॉन्फ़िगर किया था, जिसमें आग्रह किया गया था। जब भी मेरे अजाक्स कोड को एक प्रतिक्रिया मिलती है, तो xhr.getResponseHeader("x-response-url")यह परिभाषित करता है कि क्या परिभाषित किया गया है, इस मामले में यह इसे उस url से तुलना करता है जिसे यह मूल रूप से अनुरोध करता है $.ajax()। यदि तार अलग होते हैं, तो मुझे पता है कि एक पुनर्निर्देशित था, और इसके अलावा, हम वास्तव में किस यूआरएल पर पहुंचे थे।

यह कुछ सर्वर-साइड मदद की आवश्यकता का दोष है, और यह भी टूट सकता है कि क्या राउंड ट्रिप के दौरान url मुंग हो जाता है (मुद्दों के उद्धरण / एन्कोडिंग आदि के कारण) ... लेकिन 99% मामलों में, ऐसा लगता है काम हो गया।


सर्वर की ओर, मेरा विशिष्ट मामला पिरामिड वेब फ्रेमवर्क का उपयोग करते हुए एक अजगर आवेदन था, और मैंने निम्नलिखित स्निपेट का उपयोग किया:

import pyramid.events

@pyramid.events.subscriber(pyramid.events.NewResponse)
def set_response_header(event):
    request = event.request
    if request.is_xhr:
        event.response.headers['X-Response-URL'] = request.url

यह वास्तव में सच है कि यह जानने का कोई तरीका नहीं है कि क्या कोई अनुप्रेषित बिना लिया गया है; लेकिन शायद पुनर्निर्देशित के साथ अपेक्षित हेडर URL की तुलना करना इस समय मेरे लिए एक कारगर उपाय हो सकता है। विचार के लिए धन्यवाद
सर्जियो ए।

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