JQuery का उपयोग करके पुनर्निर्देश का पालन करने के लिए ajax अनुरोधों को कैसे रोकें


102

मैं एक वेब सेवा तक पहुँचने के लिए jQuery के ajax फ़ंक्शंस का उपयोग करता हूं, लेकिन सर्वर, किसी समस्या का वर्णन करने वाली स्थिति कोड के साथ प्रतिक्रिया वापस करने के बजाय, अनुरोध को समस्या का वर्णन करते हुए 200 हेडर वाले पृष्ठ पर पुनर्निर्देशित करता है। मैं इसमें कोई बदलाव नहीं कर सकता, इसलिए मुझे इसे किसी तरह क्लाइंट पर हल करने की आवश्यकता है।

उदाहरण: एक अनुरोध कुछ URL पर जाता है जो नहीं मिला है, इसलिए मुझे किसी अन्य स्थान पर 302 रीडायरेक्ट प्राप्त होता है। एक नया अनुरोध भेजा जाता है, और मुझे 200 ओके प्राप्त होते हैं, इस प्रकार त्रुटि कॉलबैक को आग लगाने से रोका जाता है।

क्या कोई तरीका है जिससे मैं ajax रिडायरेक्ट्स का पालन करने से रोक सकता हूं और इसके बजाय कॉलबैक को लागू कर सकता हूं, अधिमानतः त्रुटि विधि। वैकल्पिक रूप से, क्या यह पता लगाना संभव है कि क्या क्लाइंट में कोई रीडायरेक्ट हुआ है?



8
यह अजीब है कि आपका बैकएंड 404 के बजाय
नॉट

जवाबों:


96

मुझे आपका सवाल दिलचस्प लग रहा है, लेकिन पूरी समस्या मुझे गलत समझ रही है। कम से कम मैं समस्या की अपनी समझ समझाने की कोशिश करूँगा।

मौन (पारदर्शी) पुनर्निर्देशन XMLHttpRequestविनिर्देश का हिस्सा है ( यहां देखें विशेष रूप से शब्द "... पारदर्शी रूप से पुनर्निर्देशन का पालन करें ...")। मानक का उल्लेख केवल यह है कि उपयोगकर्ता एजेंट (वेब ​​ब्राउज़र) कुछ प्रकार के स्वचालित पुनर्निर्देशन को रोक या सूचित कर सकता है , लेकिन इसका हिस्सा नहीं है XMLHttpRequest। यह HTTP क्लाइंट कॉन्फ़िगरेशन (OS कॉन्फ़िगरेशन) या वेब ब्राउज़र कॉन्फ़िगरेशन का हिस्सा है। तो आपके jQuery.ajaxपास कोई भी विकल्प नहीं हो सकता है जहाँ आप पुनर्निर्देशन को रोक सकें।

आप देख सकते हैं कि HTTP पुनर्निर्देशन HTTP प्रोटोकॉल का हिस्सा है न कि इसका एक हिस्सा XMLHttpRequest। तो यह अमूर्त या नेटवर्क स्टैक के दूसरे स्तर पर है। उदाहरण के लिए, डेटा XMLHttpRequestको HTTP प्रॉक्सी से या स्थानीय ब्राउज़र कैश से प्राप्त किया जा सकता है, और यह HTTP प्रोटोकॉल का हिस्सा है। ज्यादातर सर्वर जो डेटा प्रदान करते हैं और क्लाइंट कैशिंग पर प्रभाव नहीं डाल सकते हैं।

आप संचार के दौरान वेब सर्वर के आईपी पते को बदलने या आईपी मार्ग को बदलने से रोकने के लिए आवश्यकता से अपने प्रश्न की तुलना कर सकते हैं। सभी चीजों को कुछ परिस्थितियों में दिलचस्प हो सकता है, लेकिन वहाँ के हिस्से हैं संचार ढेर के एक अन्य स्तर पर और द्वारा प्रबंधित नहीं किया जा सकता jQuery.ajaxया XMLHttpRequest

XMLHttpRequestमानक कहते हैं ग्राहक कॉन्फ़िगरेशन विकल्प जो पुनर्निर्देशन को रोकने के हो सकता है। "Microsoft दुनिया" के मामले में, जिसे मैं बेहतर जानता हूं, आप WinHttpSetOption फ़ंक्शन को देख सकते हैं, जिसका उपयोग मूल्य के WINHTTP_OPTION_DISABLE_FEATUREसाथ विकल्प सेट करने के लिए किया जा सकता है WINHTTP_DISABLE_REDIRECTS। दूसरा तरीका मूल्य के WINHTTP_OPTION_REDIRECT_POLICYसाथ विकल्प का उपयोग है WINHTTP_OPTION_REDIRECT_POLICY_NEVER। एक और विशेषता जो विंडोज में उपयोग की जा सकती है वह है WinHttpSetStatusCallback फ़ंक्शन जो कॉलबैक फ़ंक्शन को सेट कर सकता है जैसे कुछ सूचनाएं प्राप्त हुई हैं WINHTTP_CALLBACK_FLAG_REDIRECT

तो यह सामान्य रूप में अपनी आवश्यकताओं को लागू करने के लिए संभव करना है, लेकिन समाधान शायद आपरेशन सिस्टम या वेब ब्राउज़र से स्वतंत्र नहीं हो सकता है और के स्तर पर नहीं होगा jQuery.ajaxया XMLHttpRequest


2
बड़ी शिद्दत के साथ बेहतरीन जवाब! मुझे कर्ल के साथ कुछ अनुभव है, जिसके लिए आप समान झंडे सेट कर सकते हैं जैसा कि आप उल्लेख करते हैं। मैं उम्मीद कर रहा था कि इस तरह के निर्देश ब्राउज़र को पारित किए जा सकते हैं, लेकिन आपके उत्तर से, मैं समझता हूं कि अपेक्षित व्यवहार रीडायरेक्ट का पालन करना होगा जैसे कि प्रारंभिक अनुरोध सर्वर द्वारा निर्दिष्ट स्थान पर भेजा गया था।
जोर्जेन

@ जोर्जेन: आपका स्वागत है! सबसे परिदृश्य में पुनर्निर्देशन एक समस्या नहीं है। आप उस संदर्भ का वर्णन नहीं करते हैं जिसमें आप jQuery.ajax का उपयोग करते हैं और क्या आपके पास उस वेब सर्वर पर पूर्ण नियंत्रण है, जिसके लिए आप अनुरोध भेजते हैं। इसलिए आपको अन्य सलाह देना मुश्किल है जो वास्तव में आपकी समस्या को हल कर सकते हैं।
ओलेग

मैं सर्वर साइड को नियंत्रित नहीं करता, मुझे डर है। मुझे लगता है कि मेरा सबसे अच्छा विकल्प प्रतिक्रिया सामग्री का विश्लेषण या मान्य करना है।
जोर्जेन

@ जोर्जेन: पुनर्निर्देशन आपके मामले में एक समस्या क्यों है? यदि सर्वर ने किसी पृष्ठ को किसी अन्य स्थान पर अस्थायी या स्थायी रूप से स्थानांतरित किया है तो यह आपके मूल अनुरोध को नए स्थान पर पुनर्निर्देशित कर सकता है। यह बिल्कुल ठीक होगा। एक व्यवस्थापक वेब सर्वर को पुनर्निर्देशन करने के लिए कॉन्फ़िगर कर सकता है उदाहरण के लिए सर्वर पर संचालन या किसी अन्य समर्थन कार्य के दौरान पुनर्निर्देशन। यदि आप URL से सर्वर से पूछते हैं कि DNS में प्रशासक IP मैपिंग को दूसरे सर्वर में बदल सकता है। वह DNS पुनर्निर्धारण के रूप में उसी तरह HTTP पुनर्निर्देशित कर सकता है। आपकी समस्या क्या है?
ओलेग

मेरी समस्या यह है कि रीडायरेक्ट एक सामान्य त्रुटि पृष्ठ पर जाता है। मुझे पता है कि सर्वर को अलग तरीके से सेट किया जाना चाहिए, लेकिन अभी मुझे इस स्थिति के लिए एक समाधान खोजने की आवश्यकता होगी जैसा कि यह है।
जोर्जेन

23

मुझे विश्वास नहीं होता कि यह संभव है। अंतर्निहित पुस्तकालय (XHR) नए अनुरोध को पारदर्शी रूप से बनाता है। यह कहा जा रहा है, मैंने इन स्थितियों में क्या किया है (आमतौर पर सत्र-टाइमआउट प्रकार का सौदा जो मुझे लॉगिन पृष्ठ पर ले जाता है) एक कस्टम प्रतिक्रिया शीर्ष लेख वापस भेज देता है। मेरे पास एक वैश्विक अजाक्स हैंडलर भी है जो उस हेडर की उपस्थिति के लिए जाँच करता है, और जब मौजूद हो तो उचित रूप से जवाब देता है (उदाहरण के लिए, पूरे पृष्ठ को लॉगिन स्क्रीन पर पुनर्निर्देशित करता है)।

यदि आप रुचि रखते हैं, तो उस jQuery कोड को मुझे उस कस्टम हेडर के लिए देखना होगा:

/* redirects main window when AJAX request indicates that the session has expired on the backend. */
function checkSession(event, xhr, ajaxOptions)
{
    if (xhr.readyState == 4)
    {
        if(xhr.getResponseHeader("Login-Screen") != null && xhr.getResponseHeader("Login-Screen").length)
        {
            window.location.href='sessionExpired.html'; //whatever
        }
    }
}

$(document).ajaxComplete(checkSession)

1
धन्यवाद, मुझे लगता है कि मैं एक समान दृष्टिकोण के लिए समझौता करने जा रहा हूं, प्रतिक्रिया का विश्लेषण कर रहा हूं।
जोर्जेन

11

मुझे यह जांचने के लिए एक सुविधा मिली कि क्या आपका कॉल पुनर्निर्देशित किया गया है। यह xhr.state (): यदि यह "अस्वीकृत" है तो पुनर्निर्देशन हुआ।

सफलता कॉलबैक के साथ उदाहरण:

request.success(function(data, textStatus, xhr)
{
    if(xhr.state() == "resolved")
    {
        //no redirection
    }
    if(xhr.state() == "rejected")
    {
        //redirection
    }
});

त्रुटि कॉलबैक के साथ उदाहरण:

request.error(function(xhr, textStatus)
{
    if (xhr.state() == "rejected")
    {
        //redirection
        location.href = "loginpage";
    } else
    {
        //some other error happened
        alert("error");
    }
});

1
आपके उत्तर की टिप ने वास्तव में चीजों को काम करने में हमारी मदद की। नोटों के लिए जो दूसरों की मदद करेंगे, हमारे पास WebSphere पोर्टल है, जिसकी सुरक्षा साइटमिंडर के साथ एकीकृत है। हमारे पास एक पोर्टलेट है जिसमें अज़ैक्स को एक संसाधन url पर कॉल करने की आवश्यकता होती है और जब यह बाहर निकलता है, तो यह पारदर्शी रीडायरेक्ट हो रहा होता है, लेकिन हम कहीं नहीं संभाल रहे हैं कि लॉगिन पृष्ठ पर रीडायरेक्ट कैसे करें। JqXHR.state () "अस्वीकृत" होने की जाँच करने से निश्चित रूप से मदद मिली। बहुत धन्यवाद फिर से।
उरेश कुरुहुरी

महान खोज, हालांकि झूठे सकारात्मक हो सकते हैं क्योंकि "अस्वीकृत" राज्य को ट्रिगर किया जा सकता है, भले ही एक वादा खारिज कर दिया जाए और न केवल पुनर्निर्देशित किया जाए। jQuery बताते हैं जब "अस्वीकृत" राज्य को api.jquery.com/deferred.state
नितिन

1

मैं संभवतः पिछले कोडर्स के व्यावहारिक ज्ञान को नहीं जोड़ सकता, जिन्होंने जवाब दिया है, लेकिन मैं एक विशिष्ट मामला जोड़ूंगा जिसके बारे में जानने के लिए अन्य उपयोगी हो सकते हैं।

मैं SharePoint के संदर्भ में इस 302 मूक रीडायरेक्ट में आया था। मेरे पास कुछ सरल जावास्क्रिप्ट क्लाइंट कोड है जो SharePoint उप-साइट को पिंग करता है, और यदि यह 200 HTTP प्रतिक्रिया प्राप्त करता है, तो यह उस साइट पर, के माध्यम से स्थानांतरित हो जाता है window.location। यदि यह कुछ और प्राप्त करता है, तो यह उपयोगकर्ता को एक सूचना देता है कि साइट मौजूद नहीं है।

हालाँकि, उस स्थिति में जहां साइट मौजूद है, लेकिन उपयोगकर्ता के पास अनुमति नहीं है, SharePoint चुपचाप AccessDenied.aspx पृष्ठ पर पुनर्निर्देशित करता है। SharePoint पहले ही सर्वर / फार्म स्तर पर HTTP 401 प्रमाणीकरण हैंडशेक कर चुका है - उपयोगकर्ता के पास SharePoint तक पहुँच है। लेकिन उप-साइट तक पहुंच को संभाला जाता है मुझे लगता है कि मैं किसी प्रकार के डेटाबेस झंडे का उपयोग कर रहा हूं। मूक पुनर्निर्देशन मेरे "अन्य" खंड को रोक देता है, इसलिए मैं अपनी त्रुटि नहीं फेंक सकता। मेरे मामले में, यह शो-स्टॉपर नहीं है - यह लगातार अनुमानित व्यवहार है। लेकिन यह थोड़ा आश्चर्यजनक था, और मैंने इस प्रक्रिया में HTTP अनुरोधों के बारे में कुछ सीखा!


1

मुझे उसी चीज में दिलचस्पी थी और ताकमान द्वारा बताई गईstate() विधि नहीं मिल पाई और अपने लिए थोड़ी खुदाई की। किसी उत्तर की तलाश में यहाँ घूम रहे लोगों के लिए, यहाँ मेरे निष्कर्ष हैं:

जैसा कि कई बार कहा गया है, आप रीडायरेक्ट को रोक नहीं सकते, लेकिन आप उनका पता लगा सकते हैं। के अनुसार MDN आप उपयोग कर सकते हैं responseURLके XMLHttpRequestObjectसभी रीडायरेक्ट के बाद, जो अंतिम URL प्रतिक्रिया से आया शामिल होंगे। केवल चेतावनी यह है कि यह इंटरनेट एक्सप्लोरर (एज के पास है) द्वारा समर्थित नहीं है। के बाद से xhr/ jqXHRमें पारित कर दिया success/ donejQuery के समारोह वास्तविक का एक विस्तार है XMLHttpRequest, यह वहां उपलब्ध भी होना चाहिए।


0

मुझे लगता है कि आपको 200 प्रतिसाद मिल रहे हैं क्योंकि दूसरी बार पुनर्निर्देशन नहीं है, क्योंकि 404 पृष्ठ समाप्त नहीं होता है, यह कैश में सहेजा जाता है। यह कहना है कि दूसरी बार ब्राउज़र आपको कैश में पेज देता है। Ajax jquery में एक संपत्ति "कैश" है। http://api.jquery.com/jQuery.ajax/

आपको इसे "झूठा" लिखना चाहिए


0

हालांकि XmlHttpRequests में निम्न रीडायरेक्ट को अक्षम करना संभव नहीं है , यह तब है जब आप भ्रूण () का उपयोग कर रहे हैं :

fetch('url', {redirect: manual});

फ़ेच आपको यह नहीं बताएगा कि पुनर्निर्देशित URL क्या था। आप व्यवहार को अक्षम कर सकते हैं, लेकिन "पुनर्निर्देशित: मैनुअल" का उद्देश्य यह नहीं है कि उपयोगकर्ता को पुनर्निर्देशित करने के लिए अपने आप को नाम का उद्देश्य है।
lcjury

-2

मुझे यकीन नहीं है कि यह आपके मामले में लागू होगा, लेकिन आप AJAX फ़ंक्शन में विशिष्ट स्थिति कोड का जवाब देने के लिए कोड लिख सकते हैं -

$.ajax({
    url: '/admin/secret/data',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    statusCode: {
        200: function (data) {
            alert('302: Occurred');
            // Bind the JSON data to the UI
        },
        401: function (data) {
            alert('401: Occurred');
            // Handle the 401 error here.
        }
    }
});

9
मुझे नहीं लगता कि यह लागू होता है क्योंकि ओपी ने कहा कि पृष्ठभूमि में होने वाले पुनर्निर्देशन के कारण उन्हें हमेशा 200 का दर्जा कोड मिलता है ..
हां बैरी

-4

अजाक्स अनुरोध के मामले में अनुरोध हेडर में आपके पास निम्नलिखित होंगे

X-Requested-With    XMLHttpRequest

सर्वर की ओर से इस मानदंड से आप अनुरोधों को फ़िल्टर कर सकते हैं।


वह प्रतिक्रिया की जांच करना चाहता था अनुरोध नहीं (जिस पर उसका पहले से नियंत्रण है)
हां बैरी

हो सकता है कि Gfox ने सुझाव दिया हो कि 3xx लौटाने वाले अजाक्स अनुरोधों के लिए आप इस तरह के अनुरोध को फ़िल्टर कर सकते हैं और उदाहरण के लिए 403 वापस कर सकते हैं। जब आपके पास एक ऐसी वेबसाइट होती है, जिसमें ऐसे पृष्ठ होते हैं, जिन्हें प्रपत्र प्रमाणीकरण की आवश्यकता होती है और वे पृष्ठ ajax कॉल भी करते हैं और आप प्राधिकरण तर्क को एक स्थान पर रखना चाहते हैं, तो मेरे लिए यह एक मान्य उत्तर है।
मैकियाजडब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.