विभिन्न जेएस पुस्तकालयों द्वारा किए गए सभी AJAX अनुरोधों को कैसे रोकें


110

मैं अलग-अलग JS पुस्तकालयों (AngularJS, OpenLayers, ...) के साथ एक वेब ऐप बना रहा हूं और सक्षम होने के लिए सभी AJAX प्रतिक्रियाओं को इंटरसेप्ट करने का एक तरीका चाहिए, अगर लॉग उपयोगकर्ता सत्र समाप्त हो गया है (प्रतिक्रिया 401 Unauthorizedस्थिति के साथ वापस मिल जाती है ) लॉगिन पेज पर।

मुझे पता है कि AngularJS interceptorsऐसे परिदृश्यों का प्रबंधन करने की पेशकश करता है, लेकिन OpenLayers अनुरोधों में इस तरह के इंजेक्शन को प्राप्त करने का तरीका खोजने में सक्षम नहीं था। इसलिए मैंने एक वेनिला जेएस दृष्टिकोण का विकल्प चुना।

यहाँ मुझे कोड का यह टुकड़ा मिला ...

(function(open) {

    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {

        this.addEventListener("readystatechange", function() {
            console.log(this.readyState); // this one I changed
        }, false);

        open.call(this, method, url, async, user, pass);
    };

})(XMLHttpRequest.prototype.open);

... जिसे मैंने अनुकूलित किया और ऐसा लगता है कि यह अपेक्षा के अनुरूप व्यवहार करता है (केवल अंतिम Google Chrome पर इसका परीक्षण किया गया है)।

जैसा कि यह XMLHTTPRequest के प्रोटोटाइप को संशोधित करता है मैं सोच रहा हूं कि यह कितना खतरनाक हो सकता है या अगर यह गंभीर प्रदर्शन मुद्दों का उत्पादन कर सकता है। और क्या कोई वैध विकल्प होगा?

अपडेट: भेजे जाने से पहले अनुरोधों को कैसे रोकना है

पिछली चाल ठीक काम करती है। लेकिन क्या होगा यदि अनुरोध भेजे जाने से पहले उसी सीमारेखा में आप कुछ हेडर इंजेक्ट करना चाहते हैं? निम्न कार्य करें:

(function(send) {

    XMLHttpRequest.prototype.send = function(data) {

        // in this case I'm injecting an access token (eg. accessToken) in the request headers before it gets sent
        if(accessToken) this.setRequestHeader('x-access-token', accessToken);

        send.call(this, data);
    };

})(XMLHttpRequest.prototype.send);

4
मुझे पूरी तरह से सुरक्षित लगता है।
बरमार

एकमात्र प्रदर्शन प्रभाव यह है कि यह प्रत्येक AJAX प्रतिक्रिया के दौरान एक अतिरिक्त फ़ंक्शन चलाएगा, लेकिन यही आप करना चाहते हैं।
बरमार

मैं कुछ इस तरह की तलाश में था। बहुत बहुत धन्यवाद
सिल्वर मून

जवाबों:


36

इस प्रकार का फ़ंक्शन हुकिंग पूरी तरह से सुरक्षित है और अन्य कारणों से अन्य तरीकों पर नियमित रूप से किया जाता है।

और, एकमात्र प्रदर्शन प्रभाव वास्तव में केवल एक अतिरिक्त फ़ंक्शन कॉल है प्रत्येक .open()प्लस के लिए जो भी कोड आप खुद निष्पादित करते हैं जो संभवतः एक नेटवर्किंग कॉल शामिल होने पर सारहीन है।


IE में, यह किसी भी कोड को नहीं पकड़ेगा जो ActiveXObjectAjax करने की नियंत्रण पद्धति का उपयोग करने की कोशिश करता है । अच्छी तरह से लिखा कोड XMLHttpRequestऑब्जेक्ट के लिए पहले दिखता है और उपयोग करता है कि यदि उपलब्ध है और IE 7 के बाद से उपलब्ध है। लेकिन, कुछ कोड हो सकता है जो ActiveXObjectविधि का उपयोग करता है यदि यह उपलब्ध है जो IE के बहुत बाद के संस्करणों के माध्यम से सच होगा।


आधुनिक ब्राउज़रों में, अजाक्स कॉल को जारी करने के अन्य तरीके हैं जैसे कि fetch()इंटरफ़ेस यदि कोई सभी अजाक्स कॉल को हुक करना चाहता है, तो आपको बस से अधिक हुक करना होगा XMLHttpRequest


1
हाय @ jfriend00 - आप सभी अनुरोधों को कैसे प्राप्त करेंगे - stackoverflow.com/questions/44728723/… ?
कॉलेमरिक

1
@bagofcole - आप संभवतः fetch()सभी कॉलों को इंटरसेप्ट करने के लिए फंक्शन को बंदर-पैच कर सकते हैं - हालाँकि मैंने कभी खुद ऐसा प्रयास नहीं किया है। ऐसा लगता है कि यह मॉड्यूल ऐसा करता है।
jfriend00

comment_service_ajaxअनुरोधों को हुक करने के लिए YouTube को तोड़ता है ।
लेरॉय

3

यह IE (9 और नीचे) के कुछ संस्करणों के लिए XMLHttpRequests को नहीं पकड़ेगा । पुस्तकालय के आधार पर, वे पहले IE के मालिकाना ActiveX नियंत्रण की तलाश कर सकते हैं।

और, ज़ाहिर है, यदि आप IE के तहत एक गैर-सख्त DOCTYPE का उपयोग कर रहे हैं, तो सभी दांव बंद हैं, लेकिन मुझे यकीन है कि आप यह जानते थे।

संदर्भ: CanIuse


2

जैसा कि कृपया फ़ायरफ़ॉक्स एएमओ संपादक द्वारा बताया गया है Rob W,

निम्न कोड XMLHttpRequest के व्यवहार को बदलता है। डिफ़ॉल्ट रूप से, यदि तीसरा ("async") पैरामीटर निर्दिष्ट नहीं है, तो यह सत्य के लिए चूक है। जब इसे निर्दिष्ट और अपरिभाषित किया जाता है, तो यह "झूठे" के बराबर होता है, जो एक तुल्यकालिक HTTP अनुरोध में एक अनुरोध को बदल देता है। यह अनुरोध को संसाधित किए जाने के दौरान UI को अवरुद्ध करने का कारण बनता है, और XMLHttpRequest API की कुछ विशेषताएँ अक्षम भी हैं।

...

इसे ठीक करने के लिए, Open.call (....) को open.apply (यह, तर्क) से बदलें;

और यहाँ एक संदर्भ लिंक है:

https://xhr.spec.whatwg.org/#the-open()-method


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