javascript - حجب القراءة عبر الأصل(CORB)




jquery ajax (10)

لقد اتصلت بواجهة برمجة تطبيقات الطرف الثالث باستخدام Jquery AJAX. أتلقى الخطأ التالي في وحدة التحكم:

حظر قراءة المصدر المتقاطع (CORB) استجابة الرد عبر الأصل URL URL الخاص بي مع تطبيق / MIME من نوع MIME. انظر https://www.chromestatus.com/feature/5629709824032768 لمزيد من التفاصيل.

لقد استخدمت الكود التالي ل Ajax call:

$.ajax({
  type: 'GET',
  url: My Url,
  contentType: 'application/json',
  dataType:'jsonp',
  responseType:'application/json',
  xhrFields: {
    withCredentials: false
  },
  headers: {
    'Access-Control-Allow-Credentials' : true,
    'Access-Control-Allow-Origin':'*',
    'Access-Control-Allow-Methods':'GET',
    'Access-Control-Allow-Headers':'application/json',
  },
  success: function(data) {
    console.log(data);
  },
  error: function(error) {
    console.log("FAIL....=================");
  }
});

عندما قمت بتسجيل الدخول في Fiddler ، تلقيت البيانات استجابة وليس في طريقة نجاح Ajax.

أرجوك أن تساعدني.


في معظم الحالات ، يجب ألا تؤثر الاستجابة المحظورة على سلوك صفحة الويب ويمكن تجاهل رسالة خطأ CORB بأمان. على سبيل المثال ، قد يحدث التحذير في الحالات التي يكون فيها نص الاستجابة المحظورة فارغًا بالفعل ، أو عندما يتم تسليم الاستجابة إلى سياق لا يمكن معالجته (على سبيل المثال ، مستند HTML مثل صفحة خطأ 404 يتم تسليمها إلى علامة).

https://www.chromium.org/Home/chromium-security/corb-for-developers

اضطررت إلى تنظيف ذاكرة التخزين المؤقت للمتصفح ، وكنت أقرأ في هذا الرابط ، إذا حصل الطلب على استجابة فارغة ، فسوف نواجه هذا الخطأ التحذير. كنت أحصل على بعض CORS بناءً على طلبي ، وبالتالي أصبحت استجابة هذا الطلب فارغة ، كل ما كان علي فعله هو مسح ذاكرة التخزين المؤقت للمتصفح ، وتخلص CORS. كنت أتلقى CORS لأن الكروم قد حفظ رقم PORT على ذاكرة التخزين المؤقت ، وكان الخادم يقبل فقط localhost:3010 وكنت أفعل localhost:3002 ، بسبب ذاكرة التخزين المؤقت.


 dataType:'jsonp',

أنت تقدم طلب JSONP ، لكن الخادم يستجيب مع JSON.

يرفض المتصفح محاولة التعامل مع JSON على أنه JSONP لأنه سيكون مخاطرة أمنية. (إذا حاول المستعرض التعامل مع JSON كـ JSONP ، فسوف يفشل ، في أحسن الأحوال ،).

راجع هذا السؤال لمزيد من التفاصيل حول ماهية JSONP. لاحظ أن هذا اختراق سيء لحل سياسة "نفس الأصل" التي تم استخدامها قبل توفر CORS. يعد CORS حلاً أنظف وأكثر أمانًا وأكثر قوة للمشكلة.

يبدو أنك تحاول تقديم طلب عبر الأصل وتلقي كل ما يمكنك التفكير فيه في كومة ضخمة من التعليمات المتضاربة.

تحتاج إلى فهم كيفية عمل سياسة "الأصل نفسه".

انظر هذا السؤال للحصول على دليل متعمق.

الآن بعض الملاحظات حول الكود:

contentType: 'application/json',
  • يتم تجاهل هذا عند استخدام JSONP
  • أنت تقدم طلب GET. لا يوجد نص طلب لوصف نوع.
  • سيؤدي هذا إلى جعل طلب الأصل غير بسيط ، مما يعني أنه بالإضافة إلى أذونات CORS الأساسية ، تحتاج أيضًا إلى التعامل مع رحلة ما قبل الرحلة.

أزل ذلك.

 dataType:'jsonp',
  • الخادم لا يستجيب مع JSONP.

احذف هذا. (يمكنك جعل الخادم يستجيب مع JSONP بدلاً من ذلك ، لكن CORS أفضل).

responseType:'application/json',

هذا ليس خيارًا يدعمه jQuery.ajax. احذف هذا.

xhrFields: {withCredentials: false} ،

هذا هو الافتراضي. ما لم تقم بإعداده على true مع ajaxSetup ، قم بإزالة هذا.

  headers: {
    'Access-Control-Allow-Credentials' : true,
    'Access-Control-Allow-Origin':'*',
    'Access-Control-Allow-Methods':'GET',
    'Access-Control-Allow-Headers':'application/json',
  },
  • هذه هي رؤوس الاستجابة. إنهم ينتمون إلى الاستجابة وليس الطلب.
  • سيؤدي هذا إلى جعل طلب الأصل غير بسيط ، مما يعني أنه بالإضافة إلى أذونات CORS الأساسية ، تحتاج أيضًا إلى التعامل مع رحلة ما قبل الرحلة.


حاول تثبيت ملحق "Moesif CORS" إذا كنت تواجه مشكلة في google chrome. نظرًا لأنه طلب عبر الأصل ، لذلك لا يقبل Chrome استجابة حتى عندما يكون رمز حالة الاستجابة 200


قم بإرجاع الاستجابة باستخدام العنوان "Access-Control-Allow-Origin: *" راجع أدناه رمز استجابة خادم Php.

<?php header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
echo json_encode($phparray); 

لقد واجهت هذه المشكلة لأن تنسيق استجابة jsonp من الخادم غير صحيح. استجابة غير صحيحة على النحو التالي.

callback(["apple", "peach"])

المشكلة هي أن الكائن داخل callback يجب أن يكون كائن json صحيحًا ، بدلاً من صفيف json. لذلك قمت بتعديل بعض كود الخادم وقمت بتغيير تنسيقه:

callback({"fruit": ["apple", "peach"]})

قبل المستعرض بسعادة الاستجابة بعد التعديل.


هل حاولت تغيير dataType في طلب اياكس الخاص بك من jsonp إلى json ؟ التي ثابتة في حالتي.


هناك حالة حافة جديرة بالذكر في هذا السياق: يقوم Chrome (بعض الإصدارات ، على الأقل) بفحص عمليات CORS السابقة باستخدام الخوارزمية التي تم إعدادها لـ CORB . IMO ، هذا سخيف بعض الشيء لأنه لا يبدو أن عمليات ما قبل الطيران تؤثر على نموذج تهديد CORB ، ويبدو أن CORB مصمم ليكون متعامدًا مع CORS. أيضًا ، لا يمكن الوصول إلى جسم الاختبار المبدئي لـ CORS ، لذلك لا يوجد أي تأثير سلبي على مجرد تحذير مزعج.

على أي حال ، تحقق من أن استجابات CORS المبدئية (استجابات طريقة OPTIONS) لا تملك نصًا (204) . 200 فارغة مع تطبيق نوع المحتوى / octet- تيار وطول صفر عملت بشكل جيد هنا أيضا.

يمكنك تأكيد ما إذا كانت هذه هي الحالة التي تواجهها من خلال حساب تحذيرات CORB مقابل استجابات OPTIONS مع نص الرسالة.


يتم تعيين رؤوس الاستجابة بشكل عام على الخادم. اضبط 'Access-Control-Allow-Headers' على 'Content-Type' على جانب الخادم


يجب عليك إضافة CORS على جانب الخادم:

إذا كنت تستخدم nodeJS ثم:

تحتاج أولاً إلى تثبيت cors باستخدام الأمر أدناه:

npm install cors --save

أضف الآن الكود التالي إلى ملف بدء التطبيق الخاص بك مثل ( app.js or server.js )

var express = require('express');
var app = express();

var cors = require('cors');
var bodyParser = require('body-parser');

//enables cors
app.use(cors({
  'allowedHeaders': ['sessionId', 'Content-Type'],
  'exposedHeaders': ['sessionId'],
  'origin': '*',
  'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
  'preflightContinue': false
}));

require('./router/index')(app);




cross-origin-read-blocking