2017-02-10 16 views
1

На данный момент я загрузить googleAds скрипты из Omnifaces CDNResourceHandler Wich генерируетOmnifaces отсроченного скрипта с CDNResourceHandler

<script type="text/javascript" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> 

Теперь, если я пытаюсь использовать Omnifaces deferredScript с обработчиком ресурсов CDN, чтобы загрузить ту же библиотеку, то браузер отображает сообщение

Доступ к Script в 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js' от происхождения 'https://xxxx' заблокирован политикой CORS: Нет 'Access-Control-Allow-Origin' заголовок присутствует на запрошенном ресурсе .

Сгенерированный HTML

<script type="text/javascript">OmniFaces.DeferredScript.add('https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js');</script> 

Не могли бы вы объяснить, как заставить его работать? Можно комбинировать устаревшие и CDNResourceHandler утилиты ut, кажется, что он порождает проблемы CORS. Как его решить?

ответ

1

Не могли бы вы объяснить, почему у нас есть это сообщение CORS с deferredScript?

Поскольку Omnifaces по-видимому, использует XHR для запроса сценариев кросс-происхождения, а также браузеры по умолчанию блок XHR от делающих запросы перекрестную происхождения, но они не блокируют использование кросс-происхождения script.

Обновление: См. Ответ BalusC. Удалил вышеуказанный абзац из этого ответа, потому что это неверно, что Omnifaces использует XHR. По ответам BalusC вместо этого он устанавливает crossorigin=anonymous в элементе script, так что большая часть остального этого ниже ответа не имеет значения.


Насколько почему браузеры обрабатывают XHR и script иначе для запросов кросса происхождения:

Поскольку время script элемента был впервые добавлен в HTML, это позволило встраиванию скрипты перекрестного происхождения между сайтами. Но в ретроспективе, если бы мы это делали снова, мы бы не разработали его таким образом, но вместо этого ограничили бы его, чтобы использовать сценарии только с одного и того же происхождения.

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


Update: Там сейчас crossorigin атрибут для script элемента, если он используется вызывает CORS, чтобы вступить в игру для script во многом так же, как он делает для XHR и Fetch.


В отличии от к тому времени, когда X была добавлена ​​к вебу выполнению, мы имели преимущество заднего числа и разработаны так, чтобы она не работала на все поперечному происхождение. Поэтому браузеры всегда по умолчанию блокируют любой запрос перекрестного происхождения, который работает JavaScript в веб-приложении с помощью XHR.

Впоследствии мы придумали CORS как способ смягчить это ограничение: если сайт сделал запрос на отправку заголовка ответа CORS Access-Control-Allow-Origin, чтобы указать, что он выбирает получение запросов с кросс-началом, тогда браузеры будут блокировать запросы на кросс-начало для этого сайта.

+0

Ваш 1-й абзац не соответствует действительности. Где именно вы видите это в исходном коде? – BalusC

+0

Я никогда не смотрел исходный код, но из вашего ответа я вижу, что я ошибся, поэтому я удалю это. Спасибо, что позвонили мне. – sideshowbarker

2

<o:deferredScript> никогда не был предназначен для внешних ресурсов.

Ваша техническая проблема возникает из-за того, что этот тег explicitly устанавливает атрибут crossorigin="anonymous", чтобы поддерживать отчет об ошибках сценария (чтобы ошибки JavaScript могли быть отправлены на сервер для ведения журнала). Ваша конкретная проблема будет решена, если этот атрибут не установлен.

Вы можете указать report an issue to OmniFaces guys и сообщить им, чтобы пропустить этот атрибут, когда скрипт src является внешним. Пока просто продолжайте использовать простой элемент <script>. Вы можете использовать #{resource}, чтобы JSF генерировал нужный URL на основе библиотеки и имени.

<script src="#{resource['cdn:adsbygoogle.js']}"> 

Это позволяет использовать для установки вручную атрибут async="true".

+0

Спасибо за этот ответ, но я пытаюсь объединить эти утилиты omnifaces для оптимизации загрузки googleAds. Могу ли я достичь такого же результата с вашим решением? – jpl

+0