jQuery के अजाक्स अनुरोधों को बिना भेजे रद्द किया जा रहा है


87

मैं Microsoft की वर्ल्ड-वाइड टेलीस्कोप ऐप की स्क्रिप्ट को हुक करने की कोशिश कर रहा हूं। उत्तरार्द्ध कमांड के लिए पोर्ट 5050 पर सुनता है। यह उसी मशीन पर चल रहा है जैसे ब्राउज़र (अभी क्रोम, लेकिन जहां तक ​​मैं बता सकता हूं व्यवहार फ़ायरफ़ॉक्स 7 और आईई 9 के साथ समान है)।

मैं अपनी समस्या के रूप में XSS प्रतिबंध को खत्म करने की कोशिश करने के लिए मूल HTML फ़ाइल के साथ "एक्सेस-कंट्रोल-अनुमति-उत्पत्ति: *" हेडर भेज रहा हूं।

WWT तक पहुंचने का मेरा कोड इस प्रकार है:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    crossDomain: true,
    success: success,
    dataType: dataType
});

url इस मामले में "http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ..." (जाहिर है ... कुछ अतिरिक्त मापदंडों के लिए यहां आशुलिपि है)।

Chrome में नेटवर्क डायग्नोस्टिक्स को देखते हुए, मैं इसे देख सकता हूं:

Request URL:http://127.0.0.1:5050/layerApi.aspx?cmd=new&...
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Content-Type:application/x-www-form-urlencoded
Origin:http://gwheeler4
Referer:http://gwheeler4/conceptconnect.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1

अनुरोध निकल रहा है - मैं देख रहा हूं कि डब्ल्यूडब्ल्यूटी एक नई परत बना रहा है। हालाँकि, मुझे कॉलबैक नहीं मिलता है। यदि मैं एक त्रुटि कॉलबैक जोड़ता हूं, जिसे कॉल किया जाता है, लेकिन jqXHR ऑब्जेक्ट पर त्रुटि गुण सिर्फ "त्रुटि" है और स्थिति 0. है। यदि मैं Chrome में नेटवर्क अनुरोध को देखता हूं तो मैं "रद्द (रद्द)" स्थिति के रूप में देखता हूं और कोई प्रतिक्रिया नहीं ।

यदि मैं उसी URL को लेता हूं और नए ब्राउज़र टैब में पेस्ट करता हूं, तो मैं देख सकता हूं कि प्रतिक्रिया अपेक्षित XML है।

बेशक, यहाँ एक अंतर यह है कि यह एक GST नहीं POST है, लेकिन मैंने अपनी स्क्रिप्ट में यह कोशिश की है और इससे कोई फर्क नहीं पड़ता।

मैं इससे बहुत प्रभावित हूं और किसी भी नए विचार की सराहना करूंगा।


क्या आपने errorयह देखने के लिए कॉलबैक को संभालने की कोशिश की है कि क्या यह एक त्रुटि के साथ लौट रहा है?
स्ट्रिपिंगवर्यर

1
"मैं एक" एक्सेस-कंट्रोल-अलाउंस-ओरिजिन: * "हेडर भेज रहा हूं, जो मूल HTML फ़ाइल के साथ हैडर XSS को इस समस्या के रूप में समाप्त करने की कोशिश करता है।" क्या आपका मतलब है कि सर्वर एक्सेस-कंट्रोल-ओरिजिन हेडर को वापस भेज रहा है? या कि आप इसे अजाक्स अनुरोध के साथ भेज रहे हैं?
जेसन डीन

पृष्ठ को सीधे url के माध्यम से एक्सेस करने का प्रयास करें और देखें कि क्या आपको कोई आउट हो रहा है
zod

1
हां, मुझे स्टेटस टेक्स्ट "" और कोड 0 के साथ एक त्रुटि कॉलबैक मिलता है। यह एक jQuery मुद्दा नहीं है; मैं एक सीधे XHR का उपयोग करके कोड को फिर से लिखता हूं और मुझे एक ही परिणाम मिलता है - अर्थात एक शून्य के अनुरोध के साथ 4 का एक रेडीस्टेट। और एक खाली अनुरोध। Access-Control-Allow-Origin हेडर सर्वर द्वारा भेजा जा रहा है। URL के माध्यम से सीधे पृष्ठ तक पहुँचना अपेक्षित XML प्रतिक्रिया देता है।
ग्राहम व्हीलर

जवाबों:


134

यदि कोई और इसमें भाग लेता है, तो हमारे पास मुद्दा यह था कि हम लिंक से ajax अनुरोध कर रहे थे, और लिंक को फ़ॉलो करने से नहीं रोक रहे थे। तो यदि आप इसे एक onclickविशेषता में कर रहे हैं , तो सुनिश्चित करें कि यह return false;भी है।


इसने मेरे लिए भी काम किया। धन्यवाद। मैं भूल गया कि मैं अपने ऑनक्लिक हैंडलर में गलत क्यों लौट रहा था, और इसे सच में बदल दिया, और आपके पोस्ट को पढ़ने के बाद, यह अचानक मुझ पर छा गया।
शिपक्रैक

4
इसके अतिरिक्त, यदि आप एक फॉर्म का उपयोग कर रहे हैं तो return falseआपको onsubmitविशेषता के अंत में जोड़ना होगा ।
जेसन एक्सेलसन

8
@VincentClyde "return false;"कार्रवाई को समाप्त करने के लिए फ़ॉर्म और लिंक बताता है। यह मूल रूप से जावास्क्रिप्ट फॉर्म सत्यापन के लिए अभिप्रेत था, जहां एक वैध फ़ंक्शन झूठा वापस आ जाएगा यदि फॉर्म अमान्य हो गया था, तो फॉर्म को सबमिट करने से रोकना।
Tyzoid

13
तुम भी उपयोग कर सकते हैं e.preventDefault();, जहां eहै onclickघटना पैरामीटर।
हैनले

1
@Hannele ईवेंट को साझा करने के लिए बहुत बहुत धन्यवाद ।preventDefault। मुझे इसकी इतनी बुरी जरूरत थी। मुझे यह सुझाव देने वाला कोई अन्य उत्तर दिखाई नहीं दे रहा है। आपको इसे अलग उत्तर के रूप में पोस्ट करना चाहिए।
मोहित

112

यदि आप Chrome का उपयोग कर रहे हैं, तो आप मानक Chrome नेटवर्किंग पैनल में पर्याप्त जानकारी नहीं देख सकते हैं ताकि इसका मूल कारण निर्धारित किया जा सके (canceled) अनुरोध हैं।

आपको उपयोग करने की आवश्यकता है chrome://net-internals/#events जो आपको आपके द्वारा भेजे जा रहे अनुरोध का मुख्य विवरण दिखाएगा - जिसमें छिपा हुआ अनुप्रेषण / कुकीज़ के बारे में सुरक्षा जानकारी आदि शामिल हैं।

निम्नलिखित उदाहरणों से पता चलता है कि मैं नेटवर्क ट्रेस में नहीं दिखाई दे रहा था - मेरे कुकीज़ द्वारा क्रॉस सब-डोमेन नहीं भेजे जाने के कारण:

t=1374052796448 [st=  1]   +URL_REQUEST_START_JOB  [dt=261]
                            --> load_flags = 143540481 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VALIDATE_CACHE | VERIFY_EV_CERT)
                            --> method = "GET"
                            --> priority = 2
                            --> url = "https://...."
...
t=1374052796708 [st=261]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                --> HTTP/1.1 302 Moved Temporarily
                                    Content-Type: text/html
                                    Date: Wed, 17 Jul 2013 09:19:56 GMT
...
t=1374052796709 [st=262]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=0]
t=1374052796709 [st=262]        CANCELLED
t=1374052796709 [st=262]   -URL_REQUEST_START_JOB
                            --> net_error = -3 (ERR_ABORTED)

मुझे भी (रद्द) समस्या है। @, यह ट्रेस के बारे में जानने के लिए अच्छा था, दुर्भाग्य से यह किसी भी जानकारी प्रदान नहीं किया। मेरे मामले में सर्वर S3 है और मेरी बाल्टी पर cors कॉन्फ़िगर किया गया है। मैं जो कुछ भी कर रहा हूं वह एक छवि के लिए एक सरल GET है। मैं एक नेटवर्क पैनल में ओरिजिन हेडर के साथ एक अनुरोध देखता हूं, लेकिन कोई प्रतिक्रिया नहीं। जाहिरा तौर पर क्रोम सर्वर पर भेजने से पहले अनुरोध को रद्द कर देता है। कोई रीडायरेक्ट नहीं, कोई https नहीं, कोई कंटेंट नहीं। 0. पूरे दिन मेरे सिर को पीटना, फिर भी एक रहस्य।
बजे जीन वायंगरिब

@GeneVayngrib फ़ायरफ़ॉक्स आज़माएं - नेटवर्क डिबगर सीधे अधिक जानकारी दिखाएगा - आप वहां समस्या को हल करने में सक्षम हो सकते हैं और फिर इसे क्रोम में काम कर सकते हैं।
बेन वाल्डिंग

@BenW आपको धन्यवाद देता है, लेकिन फ़ायरफ़ॉक्स को इस छवि के साथ कोई समस्या नहीं है जो Amazon S3 से दी गई है।
जीन वायंगरिब

Yupp। कि बहुत मदद की!
rubmz

21

मेरे मामले में मैं type='submit'ऐसा तब कर रहा था जब मैं फॉर्म जमा कर रहा था जब पेज ajax के हिट होने से पहले फिर से लोड हो रहा था ताकि एक सरल समाधान हो type="button"। यदि आप एक प्रकार निर्दिष्ट नहीं करते हैं तो यह submitडिफ़ॉल्ट रूप से है इसलिए आपने निर्दिष्ट किया होगाtype="button"

type='submit' => type='button'

या

कोई प्रकार => type='button'


3
नेक्रों यहाँ पर पोस्टिंग, मुझ पर स्टैकओवरफ़्लो मुकदमा। मैं पूरे दिन उच्च और निम्न खोज कर रहा हूं कि मेरा अनुरोध कंसोल से क्यों काम करता है लेकिन स्क्रिप्ट नहीं, और यह जवाब था .. धन्यवाद !!!
pcort

1
मैंने लॉग इन किया और इस उत्तर को बढ़ाने के लिए इस धागे को फिर से पाया !!, इससे बहुत मदद मिली। घंटे के लिए मेरा सिर तोड़ रहा था
देव

जय श्री कृष्णा, आशा है कि यह आने में कई मदद करता है। और वे पहले पता लगा लेते हैं।
काला मम्बा

6

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। मेरे मामले में, मैं एक अपाचे सर्वर + django (स्वयं द्वारा लिखी गई सेवा) पर एक वेब सेवा का उपयोग करने की कोशिश कर रहा हूं। मैं आपके जैसा ही उत्पादन कर रहा था: क्रोम का कहना है कि इसे रद्द कर दिया गया था जबकि FF इसे ठीक करता है। अगर मैं अजाक्स के बजाय सीधे ब्राउज़र पर सेवा तक पहुंचने की कोशिश करता, तो यह भी काम करता। चारों ओर घूमते हुए, मुझे पता चला कि अपाचे के कुछ नए संस्करण प्रतिक्रिया हेडर में सही ढंग से प्रतिक्रिया की लंबाई निर्धारित नहीं कर रहे थे, इसलिए मैंने इसे मैन्युअल रूप से किया। Django के साथ, मुझे केवल इतना करना था:

response['Content-Length'] = len(content)

यदि आपके पास उस सेवा पर नियंत्रण है जिसे आप एक्सेस करने का प्रयास कर रहे हैं, तो पता करें कि आपके द्वारा उपयोग किए जा रहे प्लेटफॉर्म में प्रतिक्रिया हेडर को कैसे संशोधित किया जाए, अन्यथा आपको इस समस्या को ठीक करने के लिए सेवा प्रदाता से संपर्क करना होगा। जाहिर है, एफएफ और कई अन्य ब्राउज़र इस स्थिति को सही ढंग से संभालने में सक्षम हैं, लेकिन क्रोम डिजाइनरों ने इसे निर्दिष्ट करने का फैसला किया।


मैंने सामग्री-लंबाई हेडर सेट करने की कोशिश की, और अभी भी मूल प्रश्न में वर्णित समस्या के समान है। मैं PHP 5.3.8 और Apache 2.2.21 (विंडोज 7 में WAMP का उपयोग करके) का उपयोग कर रहा हूं
रॉडरिगो-सिलवीरा

4

मेरा मुद्दा भी ऐसा ही था। क्रोम का उपयोग: // नेट-इंटर्नल / # इवेंट मैं यह देखने में सक्षम था कि मेरा मुद्दा कुछ मूक पुनर्निर्देशन के कारण था। मेरे अनुरोध को ऑनलोड स्क्रिप्ट में निकाल दिया जा रहा था। Url फ़ॉर्म का था, " http://example.com/inner-path " और 301 स्थायी रूप से "/ आंतरिक-पथ" पर पुनर्निर्देशित कर रहा था। समस्या को ठीक करने के लिए मैंने केवल "/ आंतरिक-पथ" के लिए url को बदल दिया और उस समस्या को ठीक कर दिया। मैं अभी भी नहीं जानता कि एक स्क्रिप्ट जो एक हफ्ते पहले काम करती थी, अचानक मुझे मुद्दा दे रही थी ... आशा है कि यह किसी की मदद करता है


3

(वेब फॉर्म ASP.NET का उपयोग करते हुए)

मेरा मुद्दा यह था कि मैं सर्वर बटन क्लिक इवेंट सेटअप वाले सबमिट बटन के क्लिक इवेंट से अजाक्स को आग लगाने की कोशिश कर रहा था। मुझे बटन को सिर्फ एक साधारण बटन बनाना था (यानी <input type="button">)


आपका बहुत बहुत धन्यवाद।
फरहीन निलोफर

3

मुझे एक ही समस्या थी, मेरे लिए मैं अस्थायी तरीके से iframe बना रहा था और मैं ajax पूरा होने से पहले iframe हटा रहा था, इसलिए ब्राउज़र मेरे ajax अनुरोध को रद्द कर देगा।


आपने इस समस्या को कैसे हल किया? मेरी साइट एक iFrame में एम्बेडेड है जो मेरे द्वारा नियंत्रित नहीं है। मैं चाहता हूं कि मेरा कॉल पूरा हो जाए क्योंकि यह कुछ पृष्ठभूमि डेटा सेटिंग करता है
रिप्स

@ रिप्स यह 4 साल पहले के लिए है, वैसे भी मुझे लगता है कि मैंने प्रॉमिस
रेजा

3

@ काज़त्सुकाई के उत्तर पर विस्तार करते हुए, यदि आप किसी लिंक पर क्लिक कर रहे उपयोगकर्ता से अपना AJAX अनुरोध कर रहे हैं, तो आप इस समस्या में भाग सकते हैं।

यदि आप अपना लिंक इस तरह सेट करते हैं:

<a href="#" onclick="soAjax()">click me!</a>

और फिर निम्नलिखित की तरह एक जावास्क्रिप्ट हैंडलर:

soAjax() {
    $.ajax({ ... all your lovely parameters ... });       
}

अपने ब्राउज़र को लिंक का अनुसरण करने और प्रगति में किसी भी अनुरोध को रद्द करने से रोकने के लिए , आपको क्लिक इवेंट को प्रचारित करने से जोड़ना return falseया e.preventDefault()बंद करना चाहिए :

soAjax() {
   $.ajax({ ... etc ... });
   return false;
}

या:

soAjax(e) {
   $.ajax({ ... etc ... });
   e.preventDefault();
}

2

जब AJAX अनुरोध समाप्त हो जाता है तो दो संभावनाएं होती हैं (यदि क्रॉस-ऑरिजिनल अनुरोध नहीं):

  1. आप ईवेंट के लिए तत्व के डिफ़ॉल्ट व्यवहार को रोक नहीं रहे हैं।
  2. आप AJAX का समय बहुत कम निर्धारित करते हैं, या नेटवर्क / एप्लिकेशन बैकएंड सर्वर धीमा है।

1 के लिए समाधान) : जोड़ें return false;याe.preventDefault(); घटना हैंडलर में।

2 के लिए समाधान) : AJAX अनुरोध करते समय टाइमआउट विकल्प जोड़ें। नीचे उदाहरण है।

$.ajax({
    type: 'POST',
    url: url,
    timeout: 86400,
    data: data,
    success: success,
    dataType: dataType
});

क्रॉस-ऑरिजनल रिक्वेस्ट के लिए, क्रॉस-ओरिजिनल रिसोर्स शेयरिंग (कोर) HTTP हेडर चेक करें।


1

Http के लिए http का उपयोग करने के लिए अनुरोध करते समय मुझे यह त्रुटि मिली, जिसे https की आवश्यकता थी। मुझे लगता है कि अजाक्स कॉल पुनर्निर्देशन को संभाल नहीं रहा है। यह सही (JQuery 1.5.2 पर) के लिए सेट किए गए क्रॉसडोमेन अजाक्स विकल्प के साथ भी मामला है।


0

मेरे मामले में, मैं अपाचे का मॉड-रीराइट यूआरएल से मेल खा रहा था और https के अनुरोध को पुनर्निर्देशित कर रहा था।

क्रोम में अनुरोध देखें: // नेट-इंटर्नल / # इवेंट।

यह अनुरोध का एक आंतरिक लॉग दिखाएगा। रीडायरेक्ट के लिए जाँच करें।


0

मुझे भी यही समस्या थी, लेकिन मेरे मामले में यह एक कुकी मुद्दा था। बैक-एंड पर काम करने वाले लोगों ने JSESSIONID कुकी का रास्ता बदल दिया है, जो तब सेट होता है जब हम अपने ऐप में लॉग इन करते हैं, और मेरे कंप्यूटर पर उस नाम से एक पुराना कुकी था, लेकिन पुराने रास्ते से। इसलिए जब मैंने ब्राउज़र (क्रोम) में लॉग इन करने की कोशिश की, तो दो अलग-अलग मूल्यों के साथ JSESSIONID नामक कुकीज़ सर्वर पर भेजीं - जिसने इसे काफी उलझा दिया - इसलिए इसने अनुरोध को रद्द कर दिया। मेरे कंप्यूटर से कुकीज़ हटाना इसे ठीक कर दिया।


0

मेरे पास यह त्रुटि अधिक डरावना तरीके से थी: नेटवर्क टैब और क्रोम: // नेट-इंटर्नल / # इवेंट में js पूरा होने के बाद अनुरोध नहीं दिखा। जब js को त्रुटि में रोकते हैं तो नेटवर्क टैब ने अनुरोध को रद्द (रद्द) के रूप में दिखाया। एक वेबपेज में कई समान अनुरोधों के ठीक एक (हमेशा समान) के लिए लगातार कॉल किया गया था। Chrome को पुनरारंभ करने के बाद त्रुटि फिर से नहीं बढ़ी!


0

मैंने फ़ायरफ़ॉक्स में रद्द कर दिया था । कुछ अजाक्स-कॉल मेरे लिए पूरी तरह से ठीक काम करते हैं, लेकिन यह सहकर्मी के लिए विफल रहा, जिन्हें वास्तव में इसका उपयोग करना था।

जब मैंने ऊपर उल्लिखित क्रोम ट्रिक्स के माध्यम से इसकी जाँच की, तो मुझे कुछ भी संदिग्ध नहीं मिला। फायरबग में इसकी जाँच करते समय, इसने दो मैलीकस कॉल के बाद 'लोडिंग' एनीमेशन दिखाया, और कोई परिणाम टैब नहीं मिला।

इसका समाधान सरल था: इतिहास पर जाएं, वेबसाइट ढूंढें, राइटक्लिक -> वेबसाइट भूल जाएं।
भूल जाओ, हटाओ नहीं।

उसके बाद, अब कोई समस्या नहीं है। मेरा अनुमान है कि इसका .htaccess के साथ कुछ करना है।


0

मेरे मामले में, यह यूआरएल में लापता ट्रेलिंग स्लैश था। ट्रेलिंग स्लैश को जोड़ने से मेरी समस्या हल हो गई।


0

Dropzone.js मामले के लिए। मेरे मामले में यह timeoutऑप्शनल वैल्यू के कारण बहुत कम था। इसलिए इसे अपनी जरूरतों के हिसाब से बढ़ाएं।

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}

-1

मेरे पास एक विशेष 3G नेटवर्क के साथ यह समस्या थी।
यह हमेशा DELETE अनुरोधों पर विफल रहेगाnet_error = -101 क्रोम में // : // net-internals / # घटनाएँ।

अन्य नेटवर्कों ने ठीक काम किया है इसलिए मुझे लगता है कि एक दोषपूर्ण प्रॉक्सी सर्वर या कुछ और था।

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