Блокировка чтения из разных источников (CORB)

Я вызвал сторонний API с помощью JQuery AJAX. В консоли появляется следующая ошибка:

Cross-Origin Read Blocking (CORB) blocked cross-origin response MY URL with MIME type application/json. See https://www.chromestatus.com/feature/5629709824032768 for more details.

Я использовал следующий код для вызова Ajax:

$.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.info(data);
  },
  error: function(error) {
    console.info("FAIL....================ = ");
  }
});

Когда я зарегистрировался в Fiddler, я получил данные в ответ, но не в методе успеха Ajax.

Пожалуйста, помогите мне.

Похоже, что вызываемый вами API не включил заголовки, необходимые для разрешения междоменных вызовов из JS. Скорее всего, вместо этого вам нужно будет вызвать на сервер. Вы уверены, что ответ - это JSONP, а не простой JSON? Также обратите внимание, что заголовки, которые вы добавляете в запрос, должны вместо этого помещаться в отклик с сервера.

Rory McCrossan 15.06.2018 12:34

Вы устранили эту ошибку или предупреждение CORB? Я испытываю то же самое с модулем запроса.

Sherwin Ablaña Dapito 21.08.2018 12:18

@ SherwinAblañaDapito, если вы все еще ищете решение, см. мой ответ для сред разработки / тестирования

Colin Young 24.09.2018 19:48
Демонстрировать, как ваш JS может работать правильно, вы можете запустить Chrome в небезопасном режиме chrome.exe --user-data-dir = "C: / Chrome dev session" --disable-web-security Но "Блокировка чтения (CORB) заблокирована перекрестный ответ "должен быть исправлен на стороне сервера.
Ruslan Novikov 29.09.2018 12:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
149
4
400 030
16

Ответы 16

Заголовки ответа обычно устанавливаются на сервере. Установите 'Access-Control-Allow-Headers' на 'Content-Type' на стороне сервера

Я использую сторонний API. Так что я не могу этого сделать. Пожалуйста, дайте мне любое решение на стороне клиента.

Jignesh 16.06.2018 18:25

Сервер решает, что разрешить, а что нет. Только сервер имеет такой доступ. Управление заголовками ответов со стороны клиента представляет угрозу безопасности. Задача клиентской стороны - отправить правильный запрос, а затем получить ответ, отправленный сервером. Смотрите это: stackoverflow.com/questions/17989951/…

lifetimeLearner007 16.06.2018 18:35

Это CORB, а не CORS.

Joaquin Brandan 15.08.2018 19:48

Вам необходимо добавить 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);

Если вам нужно добавить расширение для решения вашей проблемы, вы неправильно обрабатываете запрос на стороне сервера. Просто примечание.

Alexander Falk 23.07.2018 15:02

Невозможно просить мою пользовательскую базу установить странное расширение Chrome. А как насчет других браузеров?

Israel Rodriguez 29.07.2018 18:43

Хотя этот ответ не решает проблему в долгосрочной перспективе, он использовал этот плагин, который подтвердил моим коллегам, что это проблема CORS. Так что за это проголосовали!

KoldBane 29.08.2018 20:22

@IsraelRodriguez вы ошибаетесь, это не расширение Chrome. Он должен быть установлен на стороне сервера, потому что это сервер, который должен разрешать доступ.

Vladimir Nul 01.02.2019 21:53

@VladimirNul исходный ответ был о расширении Chrome. Шубхам его переписал. Пожалуйста, проверьте историю.

Israel Rodriguez 02.02.2019 08:51

Здесь есть некоторая путаница. OP относится к CORB, а не к CORS.

Not a machine 08.03.2019 19:08

Если вы собираетесь коренным образом изменить свой ответ с помощью редактирования, вам следует подумать о создании нового ответа. Особенно если это в ответ на комментарии

Mason Schmidgall 24.06.2019 16:51

In most cases, the blocked response should not affect the web page's behavior and the CORB error message can be safely ignored. For example, the warning may occur in cases when the body of the blocked response was empty already, or when the response was going to be delivered to a context that can't handle it (e.g., a HTML document such as a 404 error page being delivered to an tag).

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

Мне пришлось очистить кеш своего браузера, я читал по этой ссылке, что, если запрос получит пустой ответ, мы получим это предупреждение об ошибке. Я получал CORS по моему запросу, и поэтому ответ на этот запрос стал пустым. Все, что мне нужно было сделать, это очистить кеш браузера, и CORS ушел. Я получал CORS, потому что хром сохранил номер ПОРТА в кеше, сервер просто принимал localhost:3010, а я делал localhost:3002 из-за кеша.

Это не ясно из вопроса, но при условии, что это что-то происходит на клиенте разработки или тестирования, и, учитывая, что вы уже используете Fiddler, вы можете получить ответ Fiddler разрешающим ответом:

  • Выберите проблемный запрос в Fiddler
  • Откройте вкладку AutoResponder
  • Щелкните Add Rule и измените правило на:
    • Метод: OPTIONS URL сервера здесь, например. Method:OPTIONS http://localhost
    • *CORSPreflightAllow
  • Проверить Unmatched requests passthrough
  • Проверить Enable Rules

Пара заметок:

  1. Очевидно, что это только решение для разработки / тестирования, где невозможно / нецелесообразно изменять службу API.
  2. Убедитесь, что любые соглашения, заключенные у вас со сторонним поставщиком API, позволяют это делать.
  3. Как отмечали другие, это часть того, как работает CORS, и в конечном итоге заголовок необходимо будет установить на сервере API. Если вы контролируете этот сервер, вы можете сами устанавливать заголовки. В этом случае, поскольку это сторонняя служба, я могу только предположить, что у них есть какой-то механизм, с помощью которого вы можете предоставить им URL-адрес исходного сайта, и они соответственно обновят свою службу, чтобы ответить правильными заголовками.

Вы пробовали изменить dataType в своем запросе ajax с jsonp на json? это исправило это в моем случае.

 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 вам также необходимо иметь дело с предполетным этапом.

Вернуть ответ с заголовком 'Access-Control-Allow-Origin: *' Проверьте код ниже для ответа сервера Php.

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

Ваш ответ НАСТОЛЬКО мне помог !!! Я просто не могу вас отблагодарить. Я буду продолжать исследовать, что делает «Access Control Allow Origin», чтобы понять последствия, но я только изучаю основы создания веб-службы PHP, и это помогло мне, как вы не поверите. СПАСИБО!!!

Adam Laurie 16.06.2019 00:52

Это вообще не решает проблему. Это ошибка CORB, вызванная отправкой ответа с Content-Type: application/json в нем. Код OP уже должен это делать.

Quentin 24.06.2019 10:07

@ Квентин, ??? Здравый смысл гласит, что до тех пор, пока у вас есть Allow Origin, браузер будет разрешать запрос независимо от любого подозрительного заголовка / тела.

Pacerier 12.06.2020 16:00

Блокировка чтения из разных источников (CORB), алгоритм, с помощью которого веб-браузеры могут идентифицировать и блокировать загрузку ресурсов из разных источников до того, как они достигнут веб-страницы ... Он предназначен для предотвращения доставки браузером определенных сетевых ответов из разных источников. на веб-страницу.

Сначала убедитесь, что эти ресурсы обслуживаются с правильным "Content-Type", т. Е. Для типа MIME JSON - "text/json", "application/json", типа MIME HTML - "text/html".

Во-вторых: установите режим на cors, то есть mode:cors

Получение будет выглядеть примерно так

 fetch("https://example.com/api/request", {
            method: 'POST',
            body: JSON.stringify(data),
            mode: 'cors',
            headers: {
                'Content-Type': 'application/json',
                "Accept": 'application/json',
            }
        })
    .then((data) => data.json())
    .then((resp) => console.info(resp))
    .catch((err) => console.info(err))

ссылки: https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md

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

Если вы работаете на localhost, попробуйте это, это единственное расширение и метод, который работал у меня (Angular, только javascript, без php)

https://chrome.google.com/webstore/detail/moesif-orign-cors-changer/digfbfaphojjndkpccljibejjbppifbc/related?hl=en

Я столкнулся с этой проблемой, потому что формат ответа jsonp от сервера неправильный. Неправильный ответ выглядит следующим образом.

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

Проблема в том, что объект внутри callback должен быть правильным объектом json, а не массивом json. Поэтому я изменил код сервера и изменил его формат:

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

Браузер с радостью принял ответ после модификации.

callback(["apple", "peach"]) - это идеальный JSONP, и он отлично работал, когда я тестировал его в разных источниках.
Quentin 24.06.2019 09:58

В этом контексте стоит упомянуть крайний случай: Chrome (по крайней мере, некоторые версии) проверяет предварительные полеты CORS, используя алгоритм, настроенный для CORB. IMO, это немного глупо, потому что предполетные операции, похоже, не влияют на модель угроз CORB, а CORB, похоже, разработан так, чтобы быть ортогональным CORS. Кроме того, тело предварительной проверки CORS недоступно, поэтому нет никаких негативных последствий, только раздражающее предупреждение.

В любом случае, проверьте, что ваши предварительные ответы CORS (ответы метода OPTIONS) не имеют тела (204). Пустой 200 с типом содержимого application / octet-stream и нулевой длиной здесь тоже хорошо работал.

Вы можете подтвердить, действительно ли это именно так, посчитав предупреждения CORB и ответы OPTIONS в теле сообщения.

Попробуйте установить расширение "Moesif CORS", если вы столкнулись с проблемой в Google Chrome. Поскольку это запрос с перекрестным происхождением, хром не принимает ответ, даже если код состояния ответа равен 200

Это плохой совет. Вы не хотите, чтобы пользователи установили расширение для посещения вашего веб-сайта.

seveneights 05.05.2021 19:43

У меня была такая же проблема с расширением Chrome. Когда я попытался добавить в свой манифест опцию content_scripts эту часть:

//{
    //  "matches": [ "<all_urls>" ],
    //  "css": [ "myStyles.css" ],
    //  "js": [ "test.js" ]
    //}

А другую часть я удаляю из своего манифеста "permissons":

"https://*/"

Только когда я удаляю его CORB в одном из моих запросов XHR, разочаровывается.

Хуже всего то, что в моем коде мало запросов XHR, и только один из них начинает получать ошибку CORB (почему CORB не отображается на другом XHR, я не знаю; почему явные изменения вызвали эту ошибку, я не знаю). Вот почему я проверял весь код снова и снова через несколько часов и потерял много времени.

На стороне сервера возникла проблема с заголовками. Я изменяю свое возвращаемое значение ASP.NET на: public async Task <string> Get (string TM) Возвращаемое значение было мгновение назад JSON (тип содержимого, я думаю, «application / json»), а теперь это другой (может быть «текст» /простой"). И это помогает. Теперь я возвращаю манифест «разрешения» на «https: // * /», и он работает.

Олег Хитрень 07.07.2019 13:40

Похоже, это предупреждение возникло при отправке пустого ответа с 200.

Эта конфигурация в моем .htaccess отображает предупреждение в Chrome:

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST,GET,HEAD,OPTIONS,PUT,DELETE"
Header always set Access-Control-Allow-Headers "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization"

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]

Но изменив последнюю строку на

RewriteRule .* / [R=204,L]

решить вопрос!

В расширении Chrome вы можете использовать

chrome.webRequest.onHeadersReceived.addListener

переписать заголовки ответа сервера. Вы можете заменить существующий заголовок или добавить дополнительный заголовок. Это тот заголовок, который вам нужен:

Access-Control-Allow-Origin: *

https://developers.chrome.com/extensions/webRequest#event-onHeadersReceived

Я застрял на проблемах CORB, и это решило их для меня.

«Начиная с Chrome 72, если вам нужно изменить ответы до того, как функция блокировки чтения перекрестных источников (CORB) сможет заблокировать ответ, вам необходимо указать 'extraHeaders' в opt_extraInfpSpec». из документа webRequests

swisswiss 05.04.2020 07:47

У меня аналогичная проблема. Мой случай связан с тем, что contentType ответа сервера - это application / json, а не text / javascript.

Итак, я решаю это со своего сервера (spring mvc):

// http://127.0.0.1:8080/jsonp/test?callback=json_123456
    @GetMapping(value = "/test")
    public void testJsonp(HttpServletRequest httpServletRequest,
                          HttpServletResponse httpServletResponse,
                          @RequestParam(value = "callback", required = false) String callback) throws IOException {
        JSONObject json = new JSONObject();
        json.put("a", 1);
        json.put("b", "test");
        String dataString = json.toJSONString();

        if (StringUtils.isBlank(callback)) {
            httpServletResponse.setContentType("application/json; charset=UTF-8");
            httpServletResponse.getWriter().print(dataString);
        } else {
            // important: contentType must be text/javascript
            httpServletResponse.setContentType("text/javascript; charset=UTF-8");
            dataString = callback + "(" + dataString + ")";
            httpServletResponse.getWriter().print(dataString);
        }
    }

Другие вопросы по теме