मैं अलग-अलग 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);